gpt4 book ai didi

assembly - 如何在 MASM 中为近乎直接的相对调用/jmp 编写绝对目标

转载 作者:行者123 更新时间:2023-12-03 23:35:28 30 4
gpt4 key购买 nike

要使正常(近直接相对)call 到绝对地址,请在 NASM 或 AT&T 语法中编写 call 0x1234567 ,汇编器 + 链接器负责计算 rel32 以从链接器放置 call 指令的任何位置到达该目标。

例如在 Linux 上,使用 yasm -felf64 foo.asm && ld foo.o -o foo 将其组装成一个静态的 64 位 ELF 可执行文件,然后使用 objdump -drwC -Mintel foo 反汇编给您:

foo:     file format elf64-x86-64
Disassembly of section .text:
0000000000400080 <_start>:
400080: e8 e2 44 e3 00 call 1234567 <_end+0xc344df>

链接器根据目标文件中的 0x1234567 重定位计算了正确的 rel32 以从 0x400080+5 到达 R_X86_64_PC32:
  0:   e8 00 00 00 00          call   5 <_start+0x5>   1: R_X86_64_PC32        *ABS*+0x1234563

如何让 MASM 和/或 MSVC inline-asm 做到这一点?

MSVC 不接受 _asm { call 1234567h; } 。错误是 C2415: improper operand typeThe only SO answer I've found 建议使用内存或寄存器中的地址间接 jmp 的解决方法,但是由于难以使用的工具而使机器代码效率低下并不是一个很好的解决方案。

我根本没有 MASM,所以我只能尝试 MSVC inline-asm (这不是一回事) on the Godbolt compiler explorer

您可以设置标签的地址并将其用作 call symbol 的目标吗?就像 GAS 的 .set symbol, 0x1234567 一样,它可以让您给符号一个地址,而不必在任何地方实际编写 symbol:

您可以直接使用 db 0E8h/ dd 1234567h - ($ + 4) 发出编码吗?可能不是, in NASM that only works with label - $ ,不是 absolute - label
我对答案最感兴趣,因此我可以将其包含在关于 jmp/call to a absolute address 的规范答案中: Call an absolute pointer in x86 machine code 绝对不适用于我想要实际使用的任何代码。

最佳答案

MASM 不支持这一点,因为 COFF 对象文件格式不支持必要的重定位。 (或者不正确支持它?根据 NASM 错误消息。)

使用 call 0x76cd75c0 nasm -f win32 中的语法给出一个错误:

error: Win32 COFF does not correctly support relative references to absolute addresses

我不知道针对实模式平面二进制文件的 MASM 是否可以做到(没有目标文件必须描述链接器的重定位),但不幸的是,MASM 可能只是在设计时根本没有语法。

另见 Error when calling function in user32.dll directly .我试过 nasm -fwin32 2.13.02 我自己在我的 Linux 桌面上遇到了同样的错误。

未经测试的可能解决方法可能是创建一个 .obj带有该绝对地址的符号定义,例如
org 0deadbeefH
global my_target
my_target:

在 NASM 中,或者您在 MASM 中执行此操作。

然后在 MASM 或 MSVC inline-asm 中,您可以使用 jmp my_target并链接到 .obj .从理论上讲,这可能会解决在目标文件中表示重定位的问题,并让链接器计算相对分支位移。

关于assembly - 如何在 MASM 中为近乎直接的相对调用/jmp 编写绝对目标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50058523/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com