2011-10-29 33 views
3

所以有「int 3」這是一個用於調試器中斷點的中斷指令。爲什麼在X86上使用單步指令?

但是接下來還有用於單步執行的「int 1」。但爲什麼這需要?我讀過在EFLAGS寄存器中設置陷阱標誌(TF)將啓用單步執行,並會陷入每條指令的操作系統。那麼爲什麼需要單獨的中斷類型呢?

謝謝!

回答

8

int 3是一個特殊的1字節中斷。如果存在的話,調用它將進入調試器,否則應用程序通常會崩潰。

當調試器設置陷阱標誌時,這會導致處理器在每條指令後自動執行一箇中斷。這允許調試器通過指令單步執行,而不必插入int 3指令。你不必明確調用這個中斷。

5

您正在將INT和INT 3指令與中斷向量混淆,如果指令被調用,那些指令將通過該中斷向量調用。沒有單步指令。如果存在INT 3(或「斷點指令」)將調用調試器(或者更確切地說,調試器將掛接INT 3向量,以便當INT 3發生時調試器將被調用)。

如果調試器設置TF(跟蹤標誌),那麼每條指令都會導致#1中斷髮生。這將導致該中斷向量中的任何地址被調用。希望這將成爲調試器的單步程序。最終,調試器將清除TF,導致單步中斷停止。

+2

實際上,int 3應該分類爲一個單獨的指令。由於它是一個單字節(0xCC)而不是兩字節的INT指令(0xCD)。 – Timoteo

+0

你說得對。我已經忘記了。 –

2

其他人已經解釋了中斷向量1和int 3指令之間的區別。

現在,如果您想知道爲什麼在處理調試中斷時涉及多箇中斷向量,我認爲這只是因爲原來的8086/8088電路旨在相對簡單並且執行相對簡單的軟件。它只有很少的特殊中斷向量,而且int向量1僅用於單步陷阱,並且通過中斷向量編號區分它與斷點陷阱是微不足道的,也就是說,只需要具有不同的處理程序就足夠了向量1和3.該設計被轉移到隨後的x86 CPU上。較新的CPU基本上並且「快速」地將該組特殊中斷向量擴展到約20以處理新的異常並且擴展了調試功能,在原始單步驟陷阱(例如取指令)的基礎上增加了幾個其他有用的中斷向量1觸發器,內存/端口I/O,任務切換等)。將它們中的大多數置於相同的中斷向量下是合乎邏輯的,因爲它們是相關的並且不消耗更多的向量。

1

int 3用於設置斷點,以便代碼可以自由執行,直到達到特定點(斷點)。這加快了調試過程,因此不需要通過已知的良好代碼進行陷阱。

int 1用於在每條指令後無條件停止。當執行條件分支指令並且狀態標誌的條件未知時,這可能很方便。否則,需要在分支地址和分支後面的指令地址處設置斷點。

當主板硬件和顯示器都是新的,未經測試的時候,int 1也可以用在主板上。

+0

它在我看來像是唯一增加的新事物,其他答案中還沒有最後一段。最後一段對於其他答案的建議編輯至關重要。 (是的,這對於新用戶來說是可以接受的,但實際上有一些有用或有趣的添加內容。) –