assembly - x86 汇编中 "align"关键字/指令的语法是什么?

标签 assembly x86 memory-alignment intel-syntax

据我了解,“数据”部分中的某些对象有时需要在 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

我的问题是:

  • 在哪些汇编风格中我应该使用 .align 而不是 align
  • 我是否需要在每个数据对象之前写入此关键字/指令,还是有办法只写入一次?
  • 我可以阅读哪些相关文档?
  • “align”是关键字还是指令(或者可能是其他内容)?

最佳答案

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)?

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

关于assembly - x86 汇编中 "align"关键字/指令的语法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70018405/

相关文章:

c++ - 如何在MIPS汇编程序中使用库?

x86 输入/输出端口 I/O 的 C 内联汇编具有操作数大小不匹配

assembly - 如何在没有 c 库中的 printf 的情况下在汇编级编程中打印整数? (itoa,整数到十进制的 ASCII 字符串)

检查变量何时被修改

c - 使用内联 asm 在 C 中强制消除尾调用

c - 结构复制到字节数组中..对齐错误?

c++ - 通常如何进行内存对齐?

assembly - jne 到 eax 中的值

assembly - 对齐节的开头是什么意思?

C asm jmp 在执行 jmp 之后返回到 jmp