我目前正在阅读 Yifeng Zhu 所著的《采用汇编语言和 C 语言的 ARM Cortex-M 微控制器的嵌入式系统》(Amazon 链接),并且我陷入了第 88 页上解释的有关 ARM 汇编中的数据对齐的概念。
本书显示了以下汇编代码和数据布局:
DCB 0xFF ; 0xFF is placed at address 0x2000 0000
ALIGN 4, 3 ; Align to a 4-byte boundary with a 3-byte offset
DCB 0x33 ; Where will 0x33 be placed?
我感到困惑的是,在
DCB 0xFF
之后,下一个地址是0x2000 0001
,ALIGN 4, 3
应该与从0x2000 0004
开始的下一个4字节边界对齐,并且有3个偏移量,0x33
应该被放置地址0x2000 0007
。我错过了什么吗?
只需要 2 个字节的填充即可到达
addr % 4 == 3
的位置。
让
align
指令采用偏移量的全部目的是避免通过进入 4 字节对齐边界然后偏移 3 来避免浪费空间。如果您想要这样做,请使用 align 4
/ dcb 0, 0, 0
手动执行此操作(或者在 ARMASM 中指定 3 个字节的零的任何简写)。
没有其他好的方法(就其他指令而言)来获取
align 4, 3
在一般情况下为您提供的内容,在您使用它时您还不知道对齐方式,如果其他汇编器支持等效的东西。 大多数只允许您与 addr % align == 0
对齐,或者 GNU 汇编器允许您指定允许的填充量限制,例如.p2align 4, 7
插入最多 7 个字节的填充以达到 2^4 (16) 边界。 (GCC 经常在函数内的循环顶部之前使用类似的东西,然后在 .p2align 3
之前使用,因此它们至少按 8 对齐,如果不会浪费太多空间,则可能按 16 对齐。)