因为我的电脑是x64的CPU,所以暂时scf编译器框架 也只有x64 的机器码生成。 最近学了下qemu虚拟机 ,安装了arm64的ubuntu 18.04,准备年后给scf加上arm64的机器码 生成。 ARM 是现在使用最多的RISC架构 的CPU,在移动设备 中使用很广泛,但PC机上几乎没有使用的。 所以,在PC机上的C代码编译成了ARM的机器指令之后,还要传到ARM的板子上去跑,这就是交叉编译 。 arm机器码的调试还是比较麻烦的,因为要在两个机器码不通用的机器上来回传文件。 然后就有大牛 做了一套虚拟机 ,就是qemu 。 法布里斯-贝拉,ffmpeg和qemu之父 qemu 的作者叫法布里斯-贝拉 ,是法国的 一个程序员,他同时也是音视频框架ffmpeg 的作者。 ffmpeg 应该都不陌生,撑起了整个多媒体行业 ! 现在看到的各种直播、短视频、美颜 的背后,都离不开ffmpeg 。 就跟Linux之父 同时还做了代码管理工具git 一样,ffmpeg之父 也做了虚拟机qemu 。 qemu 的出现,为底层技术 的开发者们提供了巨大的方便! 不用找硬件 了,也不用在两台机器上来回传代码了,直接安装个虚拟机 就行了[呲牙] 只要下载个arm64版的ubuntu 18.04,我就可以在x64的电脑 上编写arm64的机器码生成 模块了。 arm64的学名叫aarch64 ,就是arm的arch64的缩写。 arch,在底层的软硬件里一般都是指的机器平台。 它(64位的arm)与C语言的接口ABI 就是arm-v8。 32位的arm 与C语言的接口ABI是arm-v7,这个版本的前几年使用率非常高,现在应该没多少arm-v7的机器了。 在我看来,即使在移动嵌入式领域 ,32位 CPU的时代 也过去了。 在scf编译器框架 里,我准备不支持任何架构的32位机器码了,只支持64位的 。 arm64的hello world的ELF文件头 上图是arm64上的hello world的ELF头,可以看到Machine这项的名字是AArch64,其他内容跟x64的差不多。 当然ELF文件里的机器码是不一样的。 arm64的机器码 是这样的: arm64的hello world的机器码 arm的所有型号的CPU都是RISC架构 ,它的每条指令 都是4个字节 。 不像x64 ,每条指令的长度是不固定的:少的1个字节,多的很多字节。 x64的hello world的机器码 从语法分析的角度来看,arm的指令要比x64的简单很多。 每4字节就是1条指令,这32位里的每一位表示什么,就按照什么执行就行了。 但是x64的不可以,不分析完整条指令的语法,就不知道它多少字节。 x64使用可变的字节数来编码指令,一般来说,最终文件的大小比arm有优势。 在内存和硬盘特别小 的上古IT时代 ,这种编码方式有节省空间 的优势[捂脸] 现在,intel节省的那点内存空间,还不够给软件作者添麻烦的。 所以,指令长度不固定的CISC架构 ,也是个历史遗留 问题。 arm的寄存器和指令没有互相绑定的问题,例如intel的乘法指令只能使用EAX和EDX,让生成机器指令的时候还得现腾出这俩寄存器来。 arm的寄存器和指令没有耦合度,机器码生成模块写起来比intel的要简单。 春节之后,把它加上。