先上代碼。這段代碼在我的BOCHS上跑著沒問題。
*************************************************************************************************************************
1 !
2 !boot.s -- bootsect.s 的架構程式。用代碼0x07替換msag中1字元,然後在螢幕第一行上顯示
3 !
4
5 .globl begtext,begdata,begbss,endtext,enddata,endbss !全域識別碼,供ld86連結使用
6 .text !本文段
7 begtext:
8 .data !資料區段
9 begdata:
10 .bss !未初始化資料區段
11 begbss:
12 .text !本文段開始
13 BOOTSEG = 0x07c0 !BIOS載入bootsect代碼的原始段地址。這裡注意是0x07c0這是段基底位址暫存器,在轉換位物理地址是根據16位段寄存器來 表示20位匯流排定址的技術,應該是左移4位,即0x7c00,這就是BIOS載入boot.s到記憶體的位置
14
15
16 entry start !告知連結程式,程式從strat標號處開始執行
17
18 start:
19 jmpi go,BOOTSEG !段間跳轉。BOOTSEG指出跳轉段的地址,標號go是位移地址 ???????????????
20 go: mov ax,cs !段寄存器cs值-->ax,用於初始化資料區段寄存器ds和es,ax是16位通用寄存器,cs段寄存器,經過上一條指令段寄存器的值
已經從0x0000變為0x07c0。
21 mov ds,ax !ds資料區段寄存器,
22 mov es,ax !es附加段寄存器,
23 mov [msg1+17],ah !0x07-->替換字串1個點符號,喇叭會鳴一聲??????????????????
24 mov cx,#20 !共顯示20個字元,包括斷行符號分行符號,dx可用於通用寄存器,還常用來儲存計數值,如在移位指令,迴圈和串處理指示中 用作隱含的計數器。
25 mov dx,#0x1004 !字串顯示在螢幕第17行,第5列處
26 mov bx,#0x000c !字元顯示內容(紅色)
27 mov bp,#msg1 !指向要調用的字串(中斷調用要求)
28 mov ax,#0x1301 !寫字串並移動游標到串結尾處
29 int 0x10 !BIOS中斷調用0x10,功能0x13,子功能01
30 !Write string (EGA+, meaning PC AT minimum) AH=13h AL = Write mode, BH = Page Number, BL = Color, CX = String length, DH = Row, DL = Column, ES:BP = Offset of string這段是在外國網站找到的資料這樣就能解釋24-29.。網址http://en.wikipedia.org/wiki/INT_10H
行賦值的作用
31 loop0: jmp loop0 !死迴圈
32
33 msg1: .ascii "Loading system..." !調用BIOS中斷顯示的資訊。共20個ASCII碼字元。
34 .byte 13,10 !在ASCII中13表示斷行符號,10表示換行,這裡注意斷行符號的作用是使游標移動到行的開始
35
36
37 .org 510 !表示以後語句從地址510(0x1FE)開始存放
38 .word 0xAA55 !有效開機磁區標誌,供BIOS載入開機磁區使用。
39
40 .text
41 endtext:
42 .data
43 enddata:
44 .bss
45 endbss:
*******************************************************************************************************
其間很多疑問已在程式的注釋中表明,還有兩個問題沒有解決,上面註明???。
第一個是你如果把go該變成為制定 的值還是會正確運行,第二個是ah替換字串最後一個位元組就會響聲????
其實這個程式的理解還遠不止這麼多,我覺得對於初學者最關鍵的是要搞明白兩個值,0x07c0還有 0xAA55
這才是這段程式最神奇的地方。:-)呵呵呵。
關於0x07c0這個值看這篇文章:
http://blog.csdn.net/ccccdddxxx/archive/2011/06/07/6529721.asp
相信看完就理解的差不多啦
關於0xAA55這個值我也不是很清楚;
http://www.linkedin.com/answers/technology/software-development/TCH_SFT/648541-63552830
看完依然不清出。嘿嘿