【发布时间】:2014-07-21 18:17:15
【问题描述】:
我有一个关于编码的问题,因为我刚开始使用 Intel64 反汇编。指令jmp *%rsp 将如何编码?由于它使用*(指针),我有点困惑。这是否使编码特别?我似乎在手册中找不到任何内容?
到目前为止,我猜jmp *%rsp 应该编码为:ff c0 考虑到正在使用的寄存器等。ff c0 是正确的,还是我弄错了?
【问题讨论】:
我有一个关于编码的问题,因为我刚开始使用 Intel64 反汇编。指令jmp *%rsp 将如何编码?由于它使用*(指针),我有点困惑。这是否使编码特别?我似乎在手册中找不到任何内容?
到目前为止,我猜jmp *%rsp 应该编码为:ff c0 考虑到正在使用的寄存器等。ff c0 是正确的,还是我弄错了?
【问题讨论】:
你为什么不直接把它喂给汇编器呢?顺便说一下,我是ff e4。 ff c0 是 inc %eax。
* 表示在 at&t 语法中的间接跳转。有必要区分jmp foo和jmp *foo,前者是简单的相对跳转,后者是通过指针的间接跳转。 * 在这种情况下是可选的,因为它不是模棱两可的(尽管它会触发警告)。对应的是jmp *(%rsp),括号中的不同。
该指令的英特尔指令集参考条目是ff /4 jmp r/m64。
在 modr/m 编码表 2.2 中查找 /4,我们看到 esp(在 64 位模式下映射到 rsp)的值确实是 e4。
【讨论】:
随意使用在线汇编器:https://defuse.ca/online-x86-assembler.htm#disassembly
ff e4 jmp rsp
【讨论】: