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