我有一个名为 .p2align
的汇编指令,它是由 gcc
从 C 程序源代码生成的。
据我了解,对齐访问比未对齐访问更快,而且 asm
程序不会自动对齐内存位置或优化内存访问,因此您必须这样做。
我真的看不懂这个.p2align 4,,15
,尤其是最后一部分,15
。
跳过显然 gcc
生成 2 ,
而不是许多文档所报告的仅 1 个这一事实;我得到的是,这段asm
以每个位置占用2^4位的方式对齐内存,这意味着16位,所以我认为可以公平地说,一个WORD在本例中,
的长度为 16 位。
现在 15
可能意味着什么?它有多少位,有什么用?计数是否从 0
开始,因此“实际”数量是 16 而不是 15?
编辑:
我刚刚将相同的 C 源代码翻译为 32 位和 64 位 asm 代码,内存始终以相同的精确方式与相同的指令 .p2align 4,,15
对齐。这是为什么?
最佳答案
.p2align
指令已记录 here .
第一个表达式是所需的 2 的幂字节对齐。 .p2align 4
用于在 16 字节边界上对齐的焊盘。 .p2align 5
- 32 字节边界等
第二个表达式是用作填充的值。对于 x86,最好保留这个并让汇编器选择,因为有一系列指令是有效的无操作。在某些对齐指令中,您会看到 0x90
,即 NOP
指令。
最终表达式是填充的最大字节数 - 如果对齐需要的字节数超过此值,请跳过该指令。在本例中 - 4,,15
- 它什么也不做,因为 15
是产生 16 字节对齐所需的最大字节数。
关于gcc - .p2align 在 asm 代码中起什么作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21546946/