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

时间:2017-08-25 04:10:10

标签: assembly visual-c++ x86 nasm

我在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)

为了正确对齐这些变量, .data 部分必须与8个字节对齐。

我相信 .data 部分的对齐方式是由链接器指定的。我正在使用Visual C ++ 2010链接器,如何使用此链接器设置 .data 部分的对齐方式?

1 个答案:

答案 0 :(得分:2)

The align directive适用于数据和代码。

在汇编程序的输出文件(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

对象文件将其所需的对齐方式设置为2MiB。对于win32目标文件,NASM甚至具有用于节对齐的特殊语法:
section .data data align=4

ELF目标文件(Linux)的工作方式相同,每个部分都有一个必需的对齐方式。

您的目标文件(希望)最终不会填充最多2MiB的填充,如果它链接在链接之后的某个部分中具有几个字节的其他内容之后,它可能会链接到可执行文件中的.data

但是,知道(或设置)一个部分开头的最小对齐,汇编程序可以在任何部分中间的任何一点支持任何2的幂的align指令align指令不必位于节的开头。