【问题标题】:How to set align 64 in ml64.exe?如何在 ml64.exe 中设置对齐 64?
【发布时间】: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 calls SECTALIGN so the whole section has at least that alignment 时具有局部效果。

标签: assembly x86 alignment masm segments


【解决方案1】:

正如您所说,显然 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

在上面的示例中,_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

请注意,您必须在此处使用ALIAS(".rdata") 选项,因为汇编程序不会自动将_RDATA 转换为.rdata,就像将_TEXT_DATA 转换为.text.data 一样.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-07
    • 1970-01-01
    • 2013-09-05
    • 2011-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多