2013-10-28 66 views
1

我無法完全掌握遠/近jmp/call版本的細節。據我所知,在jmp/call指令附近使用指令本身的相對偏移量作爲操作數。遠端jmp /調用指令使用絕對地址作爲操作數。近/遠jmp /通話細節

1)在保護模式下,這個絕對地址只是編譯器放置的虛擬地址。
2)在實模式下,你通常會寫:

jmp [new number of code segment][proc name as offset] 

那麼絕對地址是通過公式計算:

address = new number * 10h + offset 

這實在是在實模式下的物理地址。

執行遠端jmp /呼叫時,CPU是否自動更新CS?例如,當BIOS代碼跳轉到加載的引導扇區代碼時。我沒有看到在引導扇區文件的源代碼中設置CS值。

在保護模式:cs = index in descriptor table = absolute address/page size
在實模式:cs = segment index in RAM = specified "new number of code segment"

是我的假設是否正確?
對不起,我的英文不好和複雜的解釋,但要問一些更具體的我需要得到基本的理解,並建立他們的下一個閱讀和假設。謝謝。

回答

1

是的,遠程跳轉/呼叫更新CS當然。

在保護模式下,段選擇器根據位#2的值引用表中的條目,即GDT(全局描述符表)或LDT(本地描述符表)。所述描述符條目保存段的基地址和限制。

這在intel手冊中有詳細描述。