如何设置 .data 部分的对齐方式?

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部分的对齐方式?

Pet*_*des 5

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指令不必位于节的开头。