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。
正如您所说,显然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
| 归档时间: |
|
| 查看次数: |
1421 次 |
| 最近记录: |