assembly 如何设置.data节的对齐方式?

to94eoyn  于 2022-12-04  发布在  其他
关注(0)|答案(1)|浏览(127)

我在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 区段的对齐方式?

1zmg4dgp

1zmg4dgp1#

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

目标文件将把该部分的required-alignment设置为2 MiB。至少这在Linux上是有效的,我认为在Linux上,目标文件中的部分继承了源文件中看到的最高对齐要求,因此非常高的对齐是可能的。
对于win32目标文件,NASM甚至有特殊的节对齐语法:
section .data data align=16就像手册中的例子一样。显然,在win32/win 64中,.data的默认值是align=4。最大值是64。我不知道如果没有为-f win32/-f win64指定任何指令,节中的align指令是否可以增加它的对齐。如果不是,正如手册中的警告,你可能会对齐wrt.部分的开始,但不是在绝对意义上。
ELF对象文件(Linux)的工作方式相同,每个部分都有一个必需的对齐。
您的目标文件(希望如此)最终不会填充多达2 MiB的填充,但如果它链接到其他内容之后,而这些内容在可执行文件中与.data位于同一段中,则可能会在链接之后填充。

但是,在知道(或设置)段开头的最小对齐方式的情况下,汇编程序仍然可以在任何段中间的任何点支持2的任何幂的align指令align指令不必位于段的开头。

相关问题