2015-06-30 83 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'可能以系統調用結束。 –