【发布时间】:2018-06-02 06:31:04
【问题描述】:
使用ml64.exe 为某些汇编函数代码设置align 64 的最简单方法是什么?
_TEXT 的默认对齐方式是 16,因此 ml64 不允许在 align 命令中设置超过 16。
而ml64 不允许更改_TEXT 的对齐方式。
可以创建另一个部分/段,但我们可以在主_TEXT 部分中获得64 byte 对齐吗?
有什么解决办法吗?
附:
在回答_TEXT$FOO 时建议的解决方案有效!
_TEXT$FOO SEGMENT ALIGN(64)
align 64
_TEXT$FOO ENDS
我还尝试在十六进制编辑器的 obj (coff) 文件中更改 _TEXT 部分标题中 Characteristics 中对齐字段的值。链接器使用了更改的对齐方式。那么,如果链接器可以使用 obj 文件中该字段中的任何值,为什么 ml 和 jwasm 不允许更改 _TEXT 的默认 16 字节?
在某些情况下,64 字节对齐对代码很有用。
如果您使用 16 字节对齐,那么另一个代码(可以是 C 代码)可以随机移动您的 asm 代码以获得 4 个不同的偏移量:0、16、32、48。
有些循环可能会跨越 64 字节或 32 字节的范围。因此,当您更改另一个 C 代码时,您可以看到 asm 代码的性能发生一些不可预知的变化。
【问题讨论】:
-
这很奇怪。在使用 NASM 或 YASM 创建 ELF 对象文件的 Linux 上,节中的最大对齐要求成为该节的对齐要求。 (因此对于链接后的段。)
-
您想通过 _TEXT 部分的 64 字节对齐来解决什么问题?我在这里闻到了一个可能的 XY 问题。将函数放在缓存行上?
-
过程定义前
ALIGN 64怎么样?喜欢ALIGN 64test_proc PROC...rettest_proc ENDP?您不需要更改部分本身的对齐方式,根据this 它也应该对齐下一条指令。 (我猜你的“对齐命令”是 _TEXT 部分的属性) -
也许有另一个指令设置节对齐?这就是
nasm中的ALIGN指令的工作原理:它在对齐下一个发出的字节but it also callsSECTALIGNso the whole section has at least that alignment 时具有局部效果。
标签: assembly x86 alignment masm segments