区分相同操作码的指令
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
出于学习目的,我正在 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