我有一个称为.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
pads在16字节边界上对齐。 .p2align 5
-32字节边界等
第二个表达式是用作填充的值。对于x86,最好保留它,让汇编器选择,因为有许多有效的禁忌指令。在某些对齐指令中,您将看到0x90
,这是NOP
指令。
最后一个表达式是用于填充的最大字节数-如果对齐要求的字节数更多,则跳过该指令。在这种情况下,4,,15
不会执行任何操作,因为15
是产生16字节对齐所需的最大字节数。