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

时间:2017-12-19 18:54:08

标签: assembly x86 alignment masm segments

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

1 个答案:

答案 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