2011-09-08 171 views
5

這是來自內核代碼中header.S文件的代碼片段。我無法理解lretw指令的功能。我已經檢查過這麼多在線資源的說明。幫助理解此代碼片段

# We will have entered with %cs = %ds+0x20, normalize %cs so 
# it is on par with the other segments. 
     pushw %ds 
     pushw $6f 
     lretw 

任何人都可以幫助我理解這條指令嗎?

+0

http://disi.unitn.it/~abeni/SO2/LinuxKernel/boot.html? – istepura

回答

5

ret是從程序返回的指令。所以基本上它將棧中的返回地址彈出到EIP寄存器中。

l前綴在這裏告訴它是一個從程序返回。在這種情況下,指令首先從棧中彈出一個值到EIP寄存器中,然後將第二個值彈出到CS寄存器中。

w後綴在這裏,因爲在這一步我們在實模式下運行,操作數是16位寬。

確切的代碼是:

pushw %ds 
    pushw $6f 
    lretw 
6: 

6:在這裏非常重要。所以這樣做是:將ds的值推入堆棧,將6標籤的地址推入堆棧,然後觸發此lretw指令。所以基本上,它會將標籤6的地址加載到指令指針寄存器中,並將cs寄存器的值加載到ds寄存器的值中。所以這只是繼續執行標籤6並改變cs寄存器值的一種技巧。

您應該下載http://www.intel.com/design/intarch/manuals/243191.htm,其中給出了所有指令的詳細信息,包括詳細說明每個指令正在執行的僞代碼。

+0

我看了這本手冊......但找不到具體的說明。可能是我不是很清楚.. 你真的很棒非常感謝您的明確解釋..我喜歡它.. –

+0

順便說一句,當它說正常化%cs時,意思是什麼......感謝幫助我。 –

+0

爲什麼是6美元?不$ 6f平均值的絕對值爲6 ..和f後綴是什麼?對於一系列問題感到抱歉。 –