星期四, 9月 17, 2009

BOOTSEG = 0x07c0

最近看linux的書,從基本的boot開始看起
但是看到一堆組合語言跟register都看的霧剎剎
尤其是BOOTSEG = 0x07c0跟0x7c00的關係
BIOS會從MBR把OS的開機程式Copy到0x7c00的位址,然後從此開始執行
但在boot.s中只看的到BOOTSEG = 0x07c0卻看不到0x7c00的東西
目前大概知道是因為CS跟IP的關係,但還不是很了解
先把知道的寫在下面,之後看懂了再來補完

CS:Code Segment,指程式從何處開始
IP:Instruction Pointer,指令的位置
程式目前跑到的位置為CS + IP

DS:Data Segment,指資料從記憶體的哪個位址開始
如果在組語中用到[BX]來定址([]為Indirect Addressing),所定的位址為DS + BX

由於指令實際位址都由CPU的程式計數器(PC)來決定,因此80×86CPU的PC = CS × 16 + IP。
所以0x7c00為指令執行的位址,BOOTSEG = 0x07c0代表CS為0x07c0,而IP為零,則指到的位址就是0x7c00

如果不懂可以看看這裡
http://finalfrank.pixnet.net/blog/post/22992166
http://www.ltivs.ilc.edu.tw/kocp/mpu/m3/m3-1-2.htm

沒有留言: