.p2align在asm代码中做了什么?

use*_*710 20 assembly gcc

我调用.p2align了这个汇编指令,它是由gccC程序源生成的.

据我所知,对齐访问比未对齐访问更快,asm程序也不会自动对齐内存位置或优化内存访问,因此您必须这样做.

我真的无法读到这一点.p2align 4,,15,尤其是最后一部分15.

正如许多文档报道的那样,跳过明显gcc产生2 ,而不是1 的事实; 我得到的是这段asm内存以这样的方式对齐内存,即每个位置占用2 ^ 4位,这意味着16位,所以我认为WORD在这种情况下a 是16位长是公平的.

现在15可能意味着什么?这是多少比特?计数是从0这样开始的,"实际"数量是16而不是15?

编辑:

我只是将相同的C源转换为32位和64位asm代码,内存总是以相同的方式与同一指令对齐.p2align 4,,15.这是为什么 ?

Bre*_*ale 22

.p2align指令记录在此处.

第一个表达式是所需的两个字节对齐的幂..p2align 4焊盘在16字节边界上对齐..p2align 5 - 32字节边界等

第二个表达式是用作填充的值.对于x86,最好留下这个并让汇编程序选择,因为有一系列指令是有效的无操作.在一些对齐指令中,您将看到0x90,这是NOP指令.

最后一个表达式是填充的最大字节数 - 如果对齐需要更多,则跳过该指令.在这种情况下 - 4,,15它什么都不做,因为15无论如何都是产生16字节对齐所需的最大字节数.

  • @ user2485710 - AMD/Intel为开发人员提供资源.Agner Fog的[优化手册](http://www.agner.org/optimize/)非常出色.您还可以编译简单的函数并自行完成程序集. (4认同)
  • @ user2485710 - 忘记位.它的字节对齐很重要.虽然x86不需要*代码对齐,但它可以提高循环,数据访问等的性能(复杂的主题).此外,预计函数将从链接器要求的特定对齐开始. (3认同)