當組件具有像JMP˚F會發生什麼到堆棧和幀指針的指令?JMP做什麼堆棧和幀指針?
我的意思是 - ˚F在內存中正確標籤嗎?我們如何可以跳轉到不同的地址在內存中,而不是更新我們的框架和堆棧指針...
編輯:我組裝談論英特爾的x86是:)
當組件具有像JMP˚F會發生什麼到堆棧和幀指針的指令?JMP做什麼堆棧和幀指針?
我的意思是 - ˚F在內存中正確標籤嗎?我們如何可以跳轉到不同的地址在內存中,而不是更新我們的框架和堆棧指針...
編輯:我組裝談論英特爾的x86是:)
堆棧和幀指針處理位置數據的。 jmp
指令處理位置的代碼。除非發生嚴重事故,否則不應該影響其他事件。這裏有激烈的事情的清單:
jmp
。就是這樣。即使那些個案會更改堆棧,因爲它們涉及某種上下文切換,無論是新任務還是某個異常處理程序。
還請注意,我所知道的任何操作系統都使用CPU的任務切換功能。它通常用軟件實現。
我會想你是在談論英特爾指令?在這種情況下,任何堆棧/幀指針都不會發生任何變化,代碼只是在相同的上下文中繼續執行,但在新地址處繼續執行。
我想這個答案有一些注意事項 - 它是可能導致使用jmp指令的任務切換,在這種情況下,可能會發生各種瘋狂的東西。您可能需要閱讀所有文檔的詳細信息。該Intel Software Developer's Manual有所有的細節:
jmp
文檔中卷2A編輯:指的是你對不更新跳躍問題。
你有能夠跳過你的代碼,而無需修改堆棧&幀指針。例如,與C代碼中的goto
相同 - 您可以跳過所有函數而不需要修改執行上下文。
我們如何可以跳轉到不同的地址在內存中,而不是更新我們的框架和堆棧指針...
由於指令指針(EIP)存儲在不同的寄存器從框架和堆棧指針(esp,ebp)。改變一個不會影響其他人(通常)。
好的謝謝。我想我會提出一個更具體的問題,繪製堆棧幀等,然後再問一次。如果只有我可以很容易地畫出他們的地方... – drozzy 2010-03-17 21:11:10
JMP
是組裝的goto
,與所有的暗示。
有時候,你只需要啓動從不同的地址執行。
只是注意:在x86上,有許多種「JMP」指令。正如Carl指出的那樣,最常見的是「本地」jmp,它只是簡單地改變EIP寄存器的值,所以堆棧幀根本不被觸及。我假設你是在談論這種類型的JMP的,因爲它是一個裝配有語法像產生:
jmp label
...
label:
但也有「遠」跳,這也影響了CS段寄存器。如果處理器處於實模式,它只不過是CS:IP寄存器的變化(只是一個「較大的」跳轉),但在保護模式下,CS段具有非常不同且更復雜的功能:它被解釋爲描述符呼叫/任務/中斷門,即指數在定義一樣的權限級別很多事情描述符表,任務...根據具體的描述,一個特權等級升級可能發生,或者也是一個「硬件任務」開關。這可能會導致上下文更改。除非您正在編程操作系統的核心,否則通常不會在保護模式下發現較遠的跳轉。創建段描述符幾乎總是一個內核的工作。
問候
+1爲實際解釋本地跳 – zebrabox 2010-03-17 21:26:12
我認爲你的解釋其實清楚了我! JMP是跳轉到代碼中的某個位置,文本塊!我知道了。謝謝! – drozzy 2010-03-17 21:41:27