我在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条答案
按热度按时间1zmg4dgp1#
align
指令既适用于数据,也适用于代码。在汇编程序的输出文件(MSVC链接器可以理解的格式的对象文件)中,它使用元数据表示每个节所需的对齐。
例如,如果您使用
目标文件将把该部分的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
指令不必位于段的开头。