我有一个称为.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字节对齐所需的最大字节数。

10-07 19:13