我是“打死不用IDE,使用IDE也要调用我的makefile的maker”。
在编写汇编代码时候,可能会遇到需要读取C结构体的成员。虽然知道某个结构体变量的地址,但还是得计算成员相对于结构体变量起始地址的偏移(offset)。一般来说,当编译完成,offset就确定了,但为了跨平台,我们希望,这个偏移值是在编译的时候动态生成的,只要我们在汇编中使用宏就可以了。
第一种方法最简单,那就是手工计算,每次跨平台就自己按照CPU的特性,计算需要使用的成员的偏移。由于汇编是特定平台的,所以这样做哪怕是由32、64位模式下,也是很容易的,但有些麻烦。
第二种方法很间接,那就是定义一个数组,然后在程序初始化时通过offsetof相似功能的宏填充它,在汇编代码中通过编号间接引用即可。但本来是为了提升速度才使用汇编代码的,为什么要用间接去获取一个根本不会变化的值呢。
第三种方法很完美,那就是在编译的时候动态生成。这种方式很灵活,但也比较麻烦。一些内核在构建时,由构建系统生成专门的程序处理生成offset头文件(Fiasco与QNX好像是这样的),逻辑很简单,但要求宿主系统编译代码,这有些困难,如果宿主平台也要跨的话。
Linux采用的是第三种方式,但它并没有使用专门的程序。而是使用内嵌汇编计算offset,然后将c代码编译成汇编代码,通过m