区分相同操作码的指令

Differencing the instruction of the same opcode

出于学习目的,我正在 Linux(64 位)上编写一个 ftrace 程序,我需要使用 ptrace() 系统调用来解析指令。

我感兴趣的指令是ret和call。调用指令可能采用不同的操作码(0xe8、0x9a 和 0xff)。这是最后一个质疑我的:这个 0xff 也可以代表 inc、dec、jmp 和 push 指令,但我看到 "register / opcode field" 发生了变化。

我的问题是:我怎样才能知道调用了 call 而不是 dec 或 inc?我可以访问操作码和寄存器。

感谢您阅读和帮助我。

您可以通过查看下一个指令字节中的 3 位字段(位 5、4、3)来区分。

000     inc instruction

001     dec instruction

010     intra-segment indirect call

011     inter-segment indirect call

100     intra-segment indirect jump

101     inter-segment indirect jump

110     push instruction

111     unused