x86 汇编中 "align" keyword/instruction 的语法是什么?

What is the syntax of "align" keyword/instruction in x86 assembly?

据我了解,“数据”部分中的某些对象有时需要在 x86 程序集中对齐。

我遇到的一个例子是在 x86 SSE 中使用 movaps 时:我需要为以后的 xor 加载一个特殊常量到 XMM 寄存器中。

XMM 寄存器是 128 位宽,我需要将一个 128 位长的内存位置加载到其中,这也将以 128 位对齐。

经过反复试验,我推断出我正在寻找的代码是:

section .text
_foo:
  movaps xmm0, [xor_const]  ; this is the loading part
  xor eax, eax
  ret

section .data
  align 16  ; align to 16 bytes = 128 bits
  xor_const: dd 80000000h, 80000000h, 80000000h, 80000000h  ; the 128-bit constant

我的问题是:

In which assembly flavors do I use .align instead of align?

最值得注意的是 GNU 汇编程序 (GAS) 使用 .align,但每个汇编程序都可以有自己的语法。您应该查看实际使用的任何汇编器的手册。

Do I need to write this keyword/instruction before every data object or is there a way to write it just once?

如果您可以随时跟踪对齐情况,则无需将其写在每个对象之前。例如,在您的示例中,您编写了 align 16 然后组装了 4 个双字数据,即 16 个字节。因此,在该数据之后,当前地址再次对齐到 16,而另一个 align 16 将是不必要的(尽管当然是无害的)。你可以这样写

  align 16  ; align to 16 bytes = 128 bits
  xor_const: dd 80000000h, 80000000h, 80000000h, 80000000h  ; the 128-bit constant
  another_const: dd 0deadbeef, 0deadbeefh, 0deadbeefh, 0deadbeefh

并确保 another_const 也是 16 字节对齐的。当然,如果您输入错误并且其中一个常量的字节数比您预期的要多或少,那么其他一切都将是错误的并且您的程序可能会严重崩溃 - 但也许这有好处,因为您会更快地找到错误。

What is a relevant documentation I can read about this?

您正在使用的汇编程序的手册。比如GAS manual, NASM manual,等等

Is "align" a keyword or an instruction (or maybe something else)?

它通常被称为 指令 - 影响汇编器行为但本身不是机器指令的命令。