gcc - .p2align 在 asm 代码中起什么作用?

标签 gcc assembly

我有一个名为 .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/

相关文章:

C++11 线程不工作

linux - CMP 命令无法正常工作

linux - 使用 YASM 程序集时如何更改 64 位 Linux 中的终端颜色?

assembly - bool 值 "notted"是如何汇编的?

android - __attribute__((used)) 在将静态库链接到共享对象时无效(android gcc 4.8)

c++ - 如何模拟 C++17 之前的类模板参数推导?

C - 在函数内部访问参数

c - 缓冲区溢出缓冲区长度

c++ - VS 2008 生成的奇怪汇编器

c - 使用 union/struct 成员作为 gcc 内联 asm 参数