2015-06-30 52 views
1

为了学习目的,我在Linux(64位)上编写了一个ftrace程序,我需要使用ptrace()系统调用来解析指令。区分相同操作码的指令

我感兴趣的指令是ret和call。调用指令可能采用不同的操作码(0xe8,0x9a和0xff)。这是我最后一个问题:这个0xff也可以代表inc,dec,jmp和push指令,但是我读到了“寄存器/操作码字段”的变化。

我的问题是:我如何获得调用的信息而不是dec或inc?我可以访问操作码和寄存器。

谢谢你的阅读和帮助我。

回答

1

您可以通过查看下一个指令字节中的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 
+0

所以如果下一个指令字节是0001 1000,那么位(5,4,3)就是110,这意味着我们要处理一条推送指令? 如果有人知道答案,我会有另外一个问题:为什么在可执行文件中没有相同数量的调用和ret,解析调用(0xff/0xe8/0x9a)和ret(0xc3,0xc2,0xca,0xcb)操作码?我的错误还是我缺少信息? – Krapow

+1

如果下一个指令字节是'0001 1000',那么位(5,4,3)就是'011.' –

+0

您提到的问题:如果有一个函数有3个调用,则代码(可能)包含3个调用,并且2个rets--一个来自函数,另一个来自主函数 - 不然。 'main'可能以系统调用结束。 –