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
指令的工作原理:它在对齐下一个发出的字节时具有局部效果。