2010-03-17 108 views
4

當組件具有像JMP˚F會發生什麼到堆棧和幀指針的指令?JMP做什麼堆棧和幀指針?

我的意思是 - ˚F在內存中正確標籤嗎?我們如何可以跳轉到不同的地址在內存中,而不是更新我們的框架和堆棧指針...

編輯:我組裝談論英特爾的x86是:)

回答

5

堆棧和幀指針處理位置數據jmp指令處理位置代碼。除非發生嚴重事故,否則不應該影響其他事件。這裏有激烈的事情的清單:

  • 任務切換 - 由於使用任務門
  • 故障遠跳 - 由於跳轉到一個新的頁面,是無效的,或跳出當前段或試圖非法更改權限的jmp
  • 陷阱 - 例如,由於代碼斷點。事實上,目前還沒有其他陷阱浮現在腦海。

就是這樣。即使那些個案會更改堆棧,因爲它們涉及某種上下文切換,無論是新任務還是某個異常處理程序。

還請注意,我所知道的任何操作系統都使用CPU的任務切換功能。它通常用軟件實現。

+1

我認爲你的解釋其實清楚了我! JMP是跳轉到代碼中的某個位置,文本塊!我知道了。謝謝! – drozzy 2010-03-17 21:41:27

3

我會想你是在談論英特爾指令?在這種情況下,任何堆棧/幀指針都不會發生任何變化,代碼只是在相同的上下文中繼續執行,但在新地址處繼續執行。

我想這個答案有一些注意事項 - 它可能導致使用jmp指令的任務切換,在這種情況下,可能會發生各種瘋狂的東西。您可能需要閱讀所有文檔的詳細信息。該Intel Software Developer's Manual有所有的細節:

  • jmp文檔中卷2A
  • 7.3任務卷3A開關

編輯:指的是你對不更新跳躍問題。

能夠跳過你的代碼,而無需修改堆棧&幀指針。例如,與C代碼中的goto相同 - 您可以跳過所有函數而不需要修改執行上下文。

+0

哇...我完全失去了。讓我想想。更新了問題... – drozzy 2010-03-17 21:03:42

+0

那些在我的腦海裏有點... – drozzy 2010-03-17 21:10:21

+0

請注意,AFAIK沒有操作系統實際上使用任務。 – 2010-03-17 21:24:20

3

我們如何可以跳轉到不同的地址在內存中,而不是更新我們的框架和堆棧指針...

由於指令指針(EIP)存儲在不同的寄存器從框架和堆棧指針(esp,ebp)。改變一個不會影響其他人(通常)。

+0

好的謝謝。我想我會提出一個更具體的問題,繪製堆棧幀等,然後再問一次。如果只有我可以很容易地畫出他們的地方... – drozzy 2010-03-17 21:11:10

2

JMP是組裝的goto,與所有的暗示。

有時候,你只需要啓動從不同的地址執行。

3

只是注意:在x86上,有許多種「JMP」指令。正如Carl指出的那樣,最常見的是「本地」jmp,它只是簡單地改變EIP寄存器的值,所以堆棧幀根本不被觸及。我假設你是在談論這種類型的JMP的,因爲它是一個裝配有語法像產生:

jmp label 
... 

label: 

但也有「遠」跳,這也影響了CS段寄存器。如果處理器處於實模式,它只不過是CS:IP寄存器的變化(只是一個「較大的」跳轉),但在保護模式下,CS段具有非常不同且更復雜的功能:它被解釋爲描述符呼叫/任務/中斷門,即指數在定義一樣的權限級別很多事情描述符表,任務...根據具體的描述,一個特權等級升級可能發生,或者也是一個「硬件任務」開關。這可能會導致上下文更改。除非您正在編程操作系統的核心,否則通常不會在保護模式下發現較遠的跳轉。創建段描述符幾乎總是一個內核的工作。

問候

+0

+1爲實際解釋本地跳 – zebrabox 2010-03-17 21:26:12