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

Igo*_*lov 3 x86 assembly masm alignment segments

align 64使用 来设置某些汇编器功能代码的最简单方法是什么ml64.exe?默认对齐方式_TEXT为 16,因此ml64不允许在align命令中设置超过 16。并且ml64不允许更改 的对齐方式_TEXT

可以创建另一个部分/段,但是我们可以64 byte在主_TEXT部分中对齐吗?

有什么解决办法吗?

PS 解决方案建议在答案中_TEXT$FOO有效! _TEXT$FOO SEGMENT ALIGN(64) align 64 _TEXT$FOO ENDS

Characteristics我还尝试在十六进制编辑器中更改 obj (coff) 文件中的节标题中的对齐字段中的值_TEXT。链接器使用了改变的对齐方式。_TEXT那么,如果链接器可以使用 obj 文件中该字段的任何值,为什么 ml 和 jwasm 不允许更改 的默认 16 字节呢?

在某些情况下,64 字节对齐对于代码很有用。如果您使用 16 字节对齐,则另一个代码(可以是Ccode)可以随机将您的asm代码移动 4 个不同的偏移量:0、16、32、48。并且某些循环可能可以跨越 64 字节或 32 字节范围。asm因此,当您更改另一个代码时,您可以看到代码性能的一些不可预测的变化C

Ros*_*dge 5

正如您所说,显然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
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,_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
Run Code Online (Sandbox Code Playgroud)

请注意,您必须在此处使用该选项,ALIAS(".rdata")因为汇编器不会自动将and转换_RDATA为and 。.rdata_TEXT_DATA.text.data