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

Assembly 如何在ml64.exe中设置align 64?,assembly,x86,alignment,masm,segments,Assembly,X86,Alignment,Masm,Segments,使用ml64.exe为某些汇编函数代码设置align 64的最简单方法是什么? \u TEXT的默认对齐方式是16,因此ml64不允许在align命令中设置超过16的对齐方式。 而且ml64不允许更改\u文本的对齐方式 可以创建另一个节/段,但是我们可以在主\u TEXT节中获得64字节的对齐吗 有什么解决办法吗 附言。 用\u TEXT$FOO回答时建议的解决方案有效! _文本$FOO段对齐(64) 对齐64 _文本$FOO结束 我还尝试更改hex editor中obj(coff)文件中\

使用
ml64.exe
为某些汇编函数代码设置
align 64
的最简单方法是什么?
\u TEXT
的默认对齐方式是16,因此
ml64
不允许在
align
命令中设置超过16的对齐方式。 而且
ml64
不允许更改
\u文本的对齐方式

可以创建另一个节/段,但是我们可以在主
\u TEXT
节中获得
64字节的
对齐吗

有什么解决办法吗

附言。 用
\u TEXT$FOO
回答时建议的解决方案有效!

_文本$FOO段对齐(64)
对齐64
_文本$FOO结束

我还尝试更改hex editor中obj(coff)文件中
\u TEXT
的节头中
特征中对齐字段的值。链接器使用了改变对齐方式的方法。所以,如果链接器可以使用obj文件中该字段的任何值,为什么ml和jwasm不允许更改
\u TEXT
的默认16字节

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

正如您所说,显然
ml64
(Microsoft宏汇编程序(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
在上面的示例中,链接器将
\u TEXT
\u TEXT$FOO
节合并为一个
.TEXT
节。
\u TEXT$FOO
中的代码将位于
\u TEXT
中的代码之后

请注意,如果您确实试图对齐只读数据,而不是实际代码,则应将数据放在
.rdata
部分。大概是这样的:

_RDATA  SEGMENT ALIGN(64) ALIAS(".rdata") READONLY
    DB  1h

    ALIGN   64
    PUBLIC  readonlydata
readonlydata:
    DB  0ffh
_RDATA  ENDS

请注意,您必须在此处使用
别名(“.rdata”)
选项,因为汇编程序不会自动将
\rdata
转换为
.rdata
,就像将
\u TEXT
\u DATA
转换为
.TEXT
.DATA
一样,这很奇怪。在使用NASM或YASM创建ELF对象文件的Linux上,节中最大的对齐要求成为该节的对齐要求。(链接后的段也是如此。)通过对_文本段进行64字节对齐,您试图解决什么问题?我闻到这里可能有XY问题。将函数放在缓存线上?在过程定义之前如何
ALIGN 64
?如
ALIGN 64
test\u proc-proc
..
ret
test\u proc-ENDP
?您不需要更改节本身的对齐方式,因为它也应该对齐下一条指令。(我猜您的“align命令”是指_textsection的属性)可能还有另一个指令设置了节对齐方式?这就是
nasm
中的
ALIGN
指令的工作原理:它在对齐下一个发出的字节时具有局部效果。