小编Ale*_*sky的帖子

如何执行具有 64 位绝对地址的调用指令?

我正在尝试从机器代码调用一个函数 - 在编译和链接时应该有一个绝对地址。我正在创建一个指向所需函数的函数指针,并试图将其传递给 call 指令,但我注意到 call 指令最多占用 16 位或 32 位地址。有没有办法调用绝对 64 位地址?

我正在部署 x86-64 架构并使用 NASM 生成机器代码。

如果我可以保证可执行文件肯定会映射到内存的底部 4GB,我可以使用 32 位地址,但我不确定在哪里可以找到该信息。

编辑:我不能使用 callf 指令,因为这需要我禁用 64 位模式。

第二次编辑:我也不想将地址存储在寄存器中并调用寄存器,因为这对性能至关重要,而且我无法承受间接函数调用的开销和性能影响。

最终编辑:通过确保我的机器代码映射到前 2GB 内存,我能够使用 rel32 调用指令。这是通过带有 MAP_32BIT 标志的 mmap 实现的(我使用的是 linux):

MAP_32BIT (自 Linux 2.4.20, 2.6) 将映射放入进程地址空间的前 2 GB。对于 64 位程序,此标志仅在 x86-64 上受支持。添加它是为了允许在前 2GB 内存中的某处分配线程堆栈,以提高某些早期 64 位处理器上的上下文切换性能。现代 x86-64 处理器不再具有此功能?形式问题,因此在这些系统上不需要使用此标志。设置 MAP_FIXED 时,将忽略 MAP_32BIT 标志。

assembly jit x86-64 nasm function-call

5
推荐指数
1
解决办法
7292
查看次数

标签 统计

assembly ×1

function-call ×1

jit ×1

nasm ×1

x86-64 ×1