GNU 汇编程序:设置固定位移大小

GNU Assembler: Set fixed displacement size

提问人:Jasper Niebuhr 提问时间:11/5/2023 最后编辑:Peter CordesJasper Niebuhr 更新时间:11/5/2023 访问量:45

问:

我正在寻找一种方法来强制执行任何机器代码位移的 32 位宽度。通常,位移的大小取决于实际值,例如,位移 5 将导致单个字节值。

是否有命令行选项或类似的东西来实现这一点?

我检查了一些文档,只找到了一些可以在 asm 本身中使用的前/后缀,例如 {disp32}。在 gcc 构建过程中,我需要它从命令行工作。

Assembly GCC X86 GNU-Assembler 机器代码

评论

3赞 fuz 11/5/2023
我不认为有 gcc 选项。你这样做想达到什么目的?
2赞 Peter Cordes 11/5/2023
也许扫描 asm 源,以便您可以在那时进行更改,仅针对实际需要它的指针引用?如果可以移动结构的第一个成员,则“disp0”(无位移)可能必须更改为 disp8 (-128..+127) 或 disp32,因此您可能需要加载每个取消引用。使每个寻址模式都需要 4 字节的 disp32 可能会影响性能(I-cache 和 uop-cache 命中率)。如果堆栈上存储了一个大结构,甚至可能需要它,尽管内核代码通常可能会避免这种情况?16(%rsp)
2赞 Peter Cordes 11/5/2023
或者,如果您确实想修改二进制文件,您仍然可以添加一个处理步骤,在构建文件时修改 asm 源代码。喜欢 / 修改 / 。(也许使用一个 tmp 文件或一个单独的构建目录,以防源代码有 和 ,尽管可能大多数 asm 源文件都是.ogcc -S foo.cfoo.sgcc -c foo.sfoo.cfoo.s.S)
2赞 fuz 11/6/2023
我不认为您正在尝试的通常可行,但它可能会在减少优化的情况下起作用。您可以做的一件事是,例如,永远不要将 256B 标记之前的结构成员洗牌到该标记之后。这样,位移就不需要更长了。或者修补 binutils 以始终产生完全位移。但要注意:0字节位移也是一种选择,通常用于第一个结构成员。
1赞 fuz 11/6/2023
@JasperNiebuhr 我不认为破解汇编程序会很困难,这样它就可以将每个内存操作数视为已提供。只需检查处理的代码并始终设置相应的位即可。{disp32}{disp32}

答: 暂无答案