【发布时间】:2018-07-12 18:18:06
【问题描述】:
我想不通,我可以做一个这样的指令,它没有问题
call ffffdd80d60e4000
但是我将如何将其转换为字节?我查看了内存中的指令并显示了一些奇怪的东西,例如
0xe8 0x00 0x40 0x0e 0xd6
我唯一能识别的是 e8 ,它是调用操作码。有人能解释一下其他 4 个字节是什么吗?如果我需要调用的地址是 DWORD64 值,我将如何将这样的指令转换为字节数组?我试过了,我不能简单地复制地址的字节并在开头添加一个 0xe8 。 对不起,如果这可能是一个愚蠢的问题,但我搜索了书籍和网站,但找不到任何相关信息。
【问题讨论】:
-
这是一个相对地址。您需要知道当前(实际上是以下)指令的地址并计算与目标的差异。另请参阅基本架构手册中的7.3.8.1 无条件传输指令部分。
-
嗯,好的,谢谢。这很奇怪,因为我正在查看 x64 asm 文档,它说 e8 是对绝对地址的调用。我想我可以计算一下。
-
你看错了。手册上说:E8 cd CALL rel32 调用近、相对、相对于下一条指令的位移。
-
相关:使用 NASM 中的
target - ($ + 5)手动编码call指令:How does $ work in NASM, exactly?。
标签: assembly x86-64 function-pointers