arm汇编align伪指令详解

本文详细解释了ARM汇编中的.align伪指令,它用于确保指令或数据的存放地址对齐,这对于某些CPU架构如ARM至关重要。通过示例展示了在i386和ARM平台上.align的不同行为,并探讨了其参数、填充方式以及与链接器的关系,强调了对数据对齐以优化程序执行效率的重要性。
摘要由CSDN通过智能技术生成

一个值得讨论的伪指令是.align,它可能在很多时候不被人注意,但是不恰当的使用将导致程序无法运行,这种可能性在ARM系统上几乎是百分之百的发生。

.align的作用在于对指令或者数据的存放地址进行对齐,有些CPU架构要求固定的指令长度并且存放地址相对于2的幂指数圆整,否则程序无法正常运行,比如ARM;有些系统却不需要,如果不遵循地址的圆整规则,程序依然可以正确执行,只是降低了一些执行效率,比如i386。.align的作用范围只限于紧跟它的那条指令或者数据,而接下来的指令或者数据的地址由上一条指令的地址和其长度决定。这里给出一个很好的用来测试.align作用的例子,首先在i386上进行测试。

 

  1. .section .text #定义代码段
  2. data:
  3. .byte 0x11
  4. .align 2
  5. .globl _start
  6. _start:
  7. movl data, %ebx
  8. movl $1, %eax
  9. int $0x80

 

这个程序没有实际的应用意义。为了防止编译出的目标文件中不同的段均从0开始而看不到.align的效果,这里只定义一个代码段,.byte数据将被编译进代码段,_start中的第一条指令将紧跟在0x11数据之后,我们使用 as -o test.o test.S && objdump -D test.o来查看反汇编的结果:

 

  1. Disassembly of section .text:
  2. 00000000 :
  3. 0: 11 8d 76 00 bb 00 adc %ecx,0xbb0076(%ebp)
  4. 00000004 <_start>:
  5. 4: bb 00 00 00 00 mov $0x0,%ebx
  6. 9: a1 00 00 00 00 mov 0x0,%eax
  7. e: cd 80 int $0x80

objdump尝试将代码段中的所有二进制数据当作指令解析,所以不要关心非代码段反汇编后的指令adc %ecx,0xbb0076(%ebp)。我们需要关心的是mov $0x0,%ebx所在的地址4,显然它和.align指定的4可以除尽,也即相对齐于4的倍数的地址。为了作一比较,移除.align 4,得到以下的反汇编结果,显然此时的第一条mov指令的对齐地址是1。

 

  1. Disassembly of section .text:
  2. 00000000 :
  3. 0: 11 bb 00 00 00 00 adc %edi,0x0(%ebx)
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值