使用align 64
为某些汇编程序功能代码设置ml64.exe
的最简单方法是什么?
_TEXT
的默认对齐为16,因此ml64
不允许在align
命令中设置超过16。
并且ml64
不允许更改_TEXT
的对齐方式。
可以创建另一个部分/细分受众群,但我们可以在主64 byte
部分进行_TEXT
对齐吗?
有没有解决方案?
P.S。
在回答_TEXT$FOO
时建议的解决方案有效!
_TEXT$FOO SEGMENT ALIGN(64)
align 64
_TEXT$FOO ENDS
我还尝试在十六进制编辑器中的obj(coff)文件中更改Characteristics
的节标题中的_TEXT
中的对齐字段中的值。并且链接器使用了改变的对齐方式。那么为什么ml和jwasm不允许更改_TEXT
的默认16个字节,如果链接器可以使用obj文件中该字段的任何值?
在某些情况下,64字节对齐对代码很有用。
如果使用16字节对齐,则另一个代码(可以是C
代码)可以随机移动asm
代码以获得4个不同的偏移量:0,16,32,48。
并且一些循环可能跨越64字节或32字节范围。因此,当您只更改另一个asm
代码时,您可以看到C
代码的一些不可预测的性能变化。
答案 0 :(得分:4)
正如你所说,显然ml64
(微软宏汇编程序(x64))不允许你改变.text
部分的对齐方式,所以你不能拥有任何内容它的对齐方式大于16个字节。但是,这个问题的解决方法很简单,并且可以使用PECOFF的分组部分功能。如果某个部分的名称中包含美元符号$
,则链接时会忽略$
之后的所有内容,以便$
之前具有相同前缀的所有部分合并为一个部分。合并的部分按完整部分名称排序,包括$
之后的内容。
例如,您可以这样做:
_TEXT$FOO SEGMENT ALIGN(64)
int 3
ALIGN 64
PUBLIC function
function:
ret
_TEXT$FOO ENDS
_TEXT SEGMENT
PUBLIC start
start:
call function
int 3
_TEXT ENDS
END
在上面的示例中,链接器会将_TEXT
和_TEXT$FOO
部分合并为一个.text
部分。 _TEXT$FOO
中的代码将位于_TEXT
中的代码之后。
请注意,如果您真的想要对齐只读数据而不是实际代码,那么您应该将数据放在.rdata
部分中。像这样:
_RDATA SEGMENT ALIGN(64) ALIAS(".rdata") READONLY
DB 1h
ALIGN 64
PUBLIC readonlydata
readonlydata:
DB 0ffh
_RDATA ENDS
请注意,您必须在此处使用ALIAS(".rdata")
选项,因为汇编程序无法将_RDATA
自动翻译为.rdata
,就像翻译_TEXT
和_DATA
一样{1}} .text
和.data
。