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
我的问题是:
- 我在哪些程序集风格中使用
.align
而不是 align
?
- 我需要在每个数据对象之前写这个 keyword/instruction 还是有办法只写一次?
- 我可以阅读哪些相关文档?
- “对齐”是关键字还是指令(或者其他)?
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)?
它通常被称为 指令 - 影响汇编器行为但本身不是机器指令的命令。
据我了解,“数据”部分中的某些对象有时需要在 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
? - 我需要在每个数据对象之前写这个 keyword/instruction 还是有办法只写一次?
- 我可以阅读哪些相关文档?
- “对齐”是关键字还是指令(或者其他)?
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)?
它通常被称为 指令 - 影响汇编器行为但本身不是机器指令的命令。