与 ARM 汇编中的 ALIGN 4, 3 行为混淆

问题描述 投票:0回答:1

我目前正在阅读 Yifeng Zhu 所著的《采用汇编语言和 C 语言的 ARM Cortex-M 微控制器的嵌入式系统》(Amazon 链接),并且我陷入了第 88 页上解释的有关 ARM 汇编中的数据对齐的概念。

本书显示了以下汇编代码和数据布局:

enter image description here

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
。我错过了什么吗?

assembly arm memory-alignment armasm
1个回答
0
投票

只需要 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 对齐。)

© www.soinside.com 2019 - 2024. All rights reserved.