offset

本文介绍了如何在编写汇编代码时动态计算C结构体成员的偏移值,避免手工计算。文章讨论了三种方法,重点讲述了Linux采用的方法,即通过内嵌汇编计算offset并在构建时使用makefile和sed生成offset头文件。文中给出了自定义的makefile函数示例,并详细解释了如何过滤和转换汇编代码,最后展示了在不同平台上实现此功能的技巧。
摘要由CSDN通过智能技术生成

我是“打死不用IDE,使用IDE也要调用我的makefile的maker”。

在编写汇编代码时候,可能会遇到需要读取C结构体的成员。虽然知道某个结构体变量的地址,但还是得计算成员相对于结构体变量起始地址的偏移(offset)。一般来说,当编译完成,offset就确定了,但为了跨平台,我们希望,这个偏移值是在编译的时候动态生成的,只要我们在汇编中使用宏就可以了。

第一种方法最简单,那就是手工计算,每次跨平台就自己按照CPU的特性,计算需要使用的成员的偏移。由于汇编是特定平台的,所以这样做哪怕是由32、64位模式下,也是很容易的,但有些麻烦。

第二种方法很间接,那就是定义一个数组,然后在程序初始化时通过offsetof相似功能的宏填充它,在汇编代码中通过编号间接引用即可。但本来是为了提升速度才使用汇编代码的,为什么要用间接去获取一个根本不会变化的值呢。

第三种方法很完美,那就是在编译的时候动态生成。这种方式很灵活,但也比较麻烦。一些内核在构建时,由构建系统生成专门的程序处理生成offset头文件(Fiasco与QNX好像是这样的),逻辑很简单,但要求宿主系统编译代码,这有些困难,如果宿主平台也要跨的话。

Linux采用的是第三种方式,但它并没有使用专门的程序。而是使用内嵌汇编计算offset,然后将c代码编译成汇编代码,通过m

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值