2013-07-14 48 views
0

如何在我的C程序中獲得IP註冊的值?例如 爲獲取AXBX寄存器的值,我們有僞變量_AX and _BXIP寄存器是否有任何僞變量? 還有其他方法嗎? 注:我需要IP寄存器的值,因爲它存儲了要執行的下一條指令的偏移地址?怎樣才能得到IP註冊的價值?

回答

3

因爲C沒有CPU寄存器的概念,所以不能用普通的C語言來完成。根據你使用的編譯器,你需要使用:

  • 一個編譯器的內在;
  • 內聯裝配;或
  • 外部彙編程序

檢查你的編譯器的文檔,看看是否有內在可用。假設沒有可用的,某種裝配將是你唯一的選擇。 x86沒有指令直接讀取IP寄存器。相反,你需要使用類似call指令(將下一個IP存儲在堆棧中)來獲取它。

這裏有一種方法來獲得在x86的IP(AT & T語法):

.globl get_ip 
get_ip: 
    mov 0(%sp), %ax 
    ret 

然後在你的C代碼,你可以這樣做:

uint16_t get_ip(); 
... 
uint16_t ip = get_ip(); 

如果你的編譯器支持在線組裝,那麼你可以使用它在C源代碼中編寫get_ip函數,而不需要單獨的彙編源文件。如果可用,請查閱您的編譯器有關內聯彙編語法的文檔。

上面當然假定你在16位程序集中工作,我假設你自從你在問題中提到了寄存器AX,BX和IP。但是,如果您希望此功能適用於32位代碼,那麼當然您需要將這些寄存器重命名爲%esp,%eax%eip,然後get_eip()將返回uint32_t而不是uint16_t

+0

+1好的答案 – pradipta