如何在ml64.exe中设置align 64?

问题描述 投票:3回答:1

使用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代码的一些不可预测的性能变化。

assembly x86 alignment masm segments
1个回答
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转换为.text.data一样。

© www.soinside.com 2019 - 2024. All rights reserved.