如何在我的C
程序中獲得IP
註冊的值?例如 爲獲取AX
和BX
寄存器的值,我們有僞變量_AX and _BX
。 IP
寄存器是否有任何僞變量? 還有其他方法嗎? 注:我需要IP
寄存器的值,因爲它存儲了要執行的下一條指令的偏移地址?怎樣才能得到IP註冊的價值?
0
A
回答
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
。
相關問題
- 1. 我怎樣才能獲得價值? Odoo
- 2. 怎樣才能獲得價值PreferenceFragment
- 3. 我怎樣才能得到我的註冊ID設備
- 4. 我怎樣才能得到我點擊的行的價值
- 5. 我怎樣才能得到最後的價值?
- 6. 我怎樣才能得到這些值
- 7. 零怎樣才能得到結果值
- 8. 我怎樣才能得到
- 9. 我怎樣才能得到
- 10. 我怎樣才能得到Android糖的價值,我只得到對象參考
- 11. 我怎樣才能獲得的價值總和的陣列內
- 12. 我怎樣才能獲得最大的價值?
- 13. 我怎樣才能獲得輸入電臺的價值C#
- 14. 點擊按鈕後,我怎樣才能獲得價值? Vue.js 2
- 15. 我怎樣才能得到Queryable.Join的MethodInfo
- 16. 我怎樣才能得到的數字
- 17. 我怎樣才能得到在Android的
- 18. 我怎樣才能獲得JSON值
- 19. 我怎樣才能獲得值「111」
- 20. 我怎樣才能從hess的cassandra中得到一個countercolumn的價值?
- 21. 我怎樣才能得到一個批處理腳本的註冊表項的值和顯示十進制值
- 22. 我怎樣才能得到哈希值的一列值
- 23. 我怎樣才能得到2列的價值,而不僅僅是一個?
- 24. 我怎樣才能得到Parsley.js
- 25. 我怎樣才能得到父組件
- 26. 我怎樣才能得到一個TD
- 27. 我怎樣才能得到statechange
- 28. 我怎樣才能得到其他表
- 29. 我怎樣才能得到一個RejectedExecutionException
- 30. 我怎樣才能得到NSScrollView尊重
+1好的答案 – pradipta