首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在ml64.exe中设置align 64?

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

Stack Overflow用户
提问于 2017-12-20 02:54:08
回答 1查看 1.1K关注 0票数 3

ml64.exe为某些汇编函数代码设置align 64的最简单方法是什么?_TEXT的默认对齐方式是16,因此ml64不允许在align命令中设置大于16的值。而且ml64不允许更改_TEXT的对齐方式。

可以创建另一个区段/段,但是我们可以在主_TEXT区段中获得64 byte对齐吗?

有什么解决方案吗?

附注:在回答_TEXT$FOO works!_TEXT$FOO SEGMENT ALIGN(64) align 64 _TEXT$FOO ENDS时建议的解决方案

我还尝试在十六进制编辑器中更改obj (coff)文件中_TEXT的节标题中Characteristics中的alignment字段的值。链接器使用了更改后的对齐方式。那么,如果链接器可以在obj文件中使用该字段中任何值,为什么ml和jwasm不允许更改_TEXT的默认16字节呢?

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-12-20 08:53:01

正如您所说,显然,ml64 (Microsoft Macro Assembler (x64))不允许您更改.text节的对齐方式,因此它的对齐方式不能超过16个字节。然而,对于这个问题有一个简单的解决方法,那就是使用PECOFF的分组部分功能。如果节的名称中有美元符号$,则在链接时将忽略$之后的所有内容,以便将$之前具有相同前缀的所有节合并为一个节。合并节按完整节名称排序,包括$之后的部分。

举个例子,你可以这样做:

代码语言:javascript
复制
_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部分中。如下所示:

代码语言:javascript
复制
_RDATA  SEGMENT ALIGN(64) ALIAS(".rdata") READONLY
    DB  1h

    ALIGN   64
    PUBLIC  readonlydata
readonlydata:
    DB  0ffh
_RDATA  ENDS

请注意,这里必须使用ALIAS(".rdata")选项,因为汇编程序不会像将_TEXT_DATA转换为.text.data那样自动将_RDATA转换为.text

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47893462

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档