用ml64.exe为某些汇编函数代码设置align 64的最简单方法是什么?_TEXT的默认对齐方式是16,因此ml64不允许在align命令中设置大于16的值。而且ml64不允许更改_TEXT的对齐方式。
可以创建另一个区段/段,但是我们可以在主_TEXT区段中获得64 byte对齐吗?
有什么解决方案吗?
附注:在回答_TEXT$FOO works!_TEXT$FOO SEGMENT ALIGN(64) align 64 _TEXT$FOO ENDS时建议的解决方案
我还尝试在十六进制编辑器中更改obj (coff)文件中_TEXT的节标题中Characteristics中的alignment字段的值。链接器使用了更改后的对齐方式。那么,如果链接器可以在obj文件中使用该字段中任何值,为什么ml和jwasm不允许更改_TEXT的默认16字节呢?
在某些情况下,64字节对齐对于代码很有用。如果您使用16字节对齐,那么另一个代码(可以是C代码)可以随机地将您的asm代码移动到4个不同的偏移量: 0、16、32、48。而且一些循环可能会跨越64字节或32字节的范围。因此,当您只更改另一个asm代码时,您可以看到C代码的性能发生了一些不可预测的变化。
发布于 2017-12-20 08:53:01
正如您所说,显然,ml64 (Microsoft Macro Assembler (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")选项,因为汇编程序不会像将_TEXT和_DATA转换为.text和.data那样自动将_RDATA转换为.text。
https://stackoverflow.com/questions/47893462
复制相似问题