use*_*277 5 x86 assembly nasm visual-c++
我在 NASM的.data部分定义了以下变量:
section .data
var1 DD 12345 ; int (4 bytes)
var2 DB 'A' ; char (1 byte)
padding1 DB 123 ; 1 byte padding
padding2 DB 123 ; 1 byte padding
padding3 DB 123 ; 1 byte padding
var3 DQ 174.13 ; double (8 bytes)
Run Code Online (Sandbox Code Playgroud)
为了正确对齐这些变量,.data部分必须对齐到 8 个字节。
我相信.data部分的对齐方式是由链接器指定的。我正在使用 Visual C++ 2010 链接器,如何使用此链接器设置.data部分的对齐方式?
该align指令适用于数据和代码。
在汇编器的输出文件(MSVC 的链接器可以理解的格式的目标文件)中,它使用元数据表示每个部分所需的对齐方式。
例如,如果您使用
section .data
align 1024*1024*2
foo: dd 1234
align 8 ; will assemble to 4 bytes of padding to reach the next multiple of 8
bar: dd 4567
Run Code Online (Sandbox Code Playgroud)
目标文件将该部分的所需对齐设置为 2MiB。对于 win32 目标文件,NASM 甚至有特殊的节对齐语法:
section .data data align=4
ELF 目标文件 (Linux) 的工作方式相同,每个部分都有一个必需的对齐方式。
您的目标文件(希望)最终不会填充高达 2MiB 的填充,但是如果它链接到某个部分中具有几个字节的其他内容之后,它可能会在链接后链接到与.data可执行文件中相同的段.
但是,知道(或设置)节开头的最小对齐方式后,汇编程序可以align在任何节中间的任何点支持任意 2 的幂的指令。该align指令不必位于节的开头。