如何在ml64.exe中设置align 64?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在ml64.exe中设置align 64?相关的知识,希望对你有一定的参考价值。
使用align 64
为某些汇编程序功能代码设置ml64.exe
的最简单方法是什么? _TEXT
的默认对齐是16,因此ml64
不允许在align
命令中设置超过16。并且ml64
不允许改变_TEXT
的对齐方式。
可以创建另一个部分/段,但我们可以在主要的64 byte
部分获得_TEXT
对齐吗?
有什么解决方案吗?
附:解决方案建议用_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
代码的一些不可预测的性能变化。
正如你所说,显然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
转换为.text
和.data
一样。
以上是关于如何在ml64.exe中设置align 64?的主要内容,如果未能解决你的问题,请参考以下文章