ARM汇编中ALIGN 4,3指令的对齐行为困惑求解
ARM汇编ALIGN指令的地址计算误区解析
你对ALIGN指令的参数理解完全搞反了——第二个参数不是“对齐到边界后再加的偏移量”,而是要求最终地址满足 (最终地址 - offset) 能被第一个参数整除,也就是最终地址 = k*expr + offset(k为整数,且最终地址 ≥ 当前地址)。
回到你的代码示例:
DCB 0xFF ; 0xFF is placed at address 0x20000000 ALIGN 4, 3 ; Align to a 4-byte boundary with a 3-byte offset DCB 0x33 ; Where will 0x33 be placed?
具体计算过程:
- 执行
DCB 0xFF后,下一个可用地址是0x20000001 ALIGN 4,3的核心要求是:找到≥0x20000001的最小地址Addr,使得(Addr - 3) mod 4 == 0,等价于Addr mod 4 == 3- 满足条件的最小Addr是
0x20000003(0x20000003-3=0x20000000,是4的倍数;而0x20000001、0x20000002的模4结果分别为1、2,不满足要求) - 因此汇编器会在
0x20000001和0x20000002位置填充2个字节(填充值由汇编器默认规则决定,通常为0),之后将0x33存储在0x20000003。
你之前的错误在于把offset当成了“对齐到标准4字节边界后额外添加的偏移”,但实际上它是参与对齐规则计算的偏移量,用来定义最终地址需要满足的模运算关系。
内容的提问来源于stack exchange,提问作者user97662
相关产品推荐
相关产品推荐

