一、本章使用工具
二、軟盤存儲介紹
總容量:280×18×512=1474560(字節(jié))280 \times 18 \times 512=1474560(字節(jié))280×18×512=1474560(字節(jié)) 三、BIOS int13功能BIOS的int13 中斷是擴展的磁盤讀取功能。入口參數(shù):
es:bx 指向接收從扇區(qū)讀入數(shù)據(jù)的內(nèi)存區(qū)/指向將寫入磁盤的數(shù)據(jù) 返回參數(shù):
一段寫磁盤示例讀屏幕到軟盤上,1屏4000Byte,使用8個扇區(qū),使用磁盤的0面0道1~8扇區(qū)存儲。 assume cs:codecode segment start: mov ax,0B800h mov es,ax mov bx,0 mov al,8 mov ch,0 mov cl,1 mov dl,0 mov dh,0 mov ah,3 int 13h mov ax,4c00h int 21H code ends end start一段讀磁盤示例讀0面0道1扇區(qū)到 0000:0200H 四、引導程序源代碼
;%define _BOOT_DEBUG_ ; 做Boot Sector時把這行注釋掉 ; 啟用這行就用nasm Boot.asm -o Boot.com生成.com文件用于調(diào)試%ifdef _BOOT_DEBUG_ org 0100h%else org 07c00h%endifCYLS EQU 10init: MOV AX,0 MOV SS,AX MOV SP,0x7c00 ; 堆??臻g,從0x7c00向前 MOV DS,AX MOV AX,0x0820 ; 把磁盤數(shù)據(jù)加載到內(nèi)存0x0820處。 0x8000~0x81ff的512字節(jié)給啟動區(qū)用的,所以從0x0820開始 MOV ES,AX ; 初始化磁盤接口 MOV CH,0 ; 柱面 0 MOV DH,0 ; 磁頭 0 MOV CL,2 ; 扇區(qū) 2readloop: MOV SI,0 ; 記錄失敗次數(shù)retry: MOV AH,0x02 ; 0x02 讀磁盤 MOV AL,1 ; 讀1個扇區(qū) MOV BX,0 MOV DL,0x00 ; A驅動器 INT 0x13 ; BIOS 讀磁盤功能 JNC next ; 成功跳轉 ADD SI,1 ; 失敗加一次 CMP SI,5 ; 到5次就跳到error JAE error MOV AH,0x00 ; 復位磁盤功能 MOV DL,0x00 INT 0x13 ; 重置磁盤驅動器 JMP retry ; 重試 next: MOV AX,ES ; 內(nèi)存地址向后移動0x0020 ADD AX,0x0020 MOV ES,AX ; 通過AX給ES加0x0020 ADD CL,1 ; 扇區(qū)+1 CMP CL,18 ; 有沒有到18個扇區(qū) JBE readloop ; CL<=18,就跳到 readloop MOV CL,1 ADD DH,1 CMP DH,2 JB readloop ; 如果 DH < 2 ,則跳到readloop MOV DH,0 ADD CH,1 CMP CH,CYLS JB readloop ; 如果CH<CYLS , 則跳到readloop JMP successprint: # 字符串顯示到屏幕 MOV AL, [SI] ADD SI, 1 CMP AL, 0 JE end MOV AH, 0x0e MOV BX, 15 INT 0x10 JMP printend: HLT JMP end ; 無限循環(huán)error: ; 打印錯誤信息 MOV SI, error_msg JMP printsuccess: MOV SI, success_msg JMP printBootMessage: DB 'Hello, MY OS!' ; 想要開機后在屏幕上顯示的字符串 DB 0success_msg: DB 'Success' ; 成功 DB 0error_msg: DB 'Error' ; 失敗 DB 0 times 510-($-$$) db 0 ; 填充剩下的空間,使生成的二進制代碼恰好為512字節(jié) $$表示一個section的開始處匯編后地址 DW 0xaa55 ; 結束標志啟動后如無異常屏幕只會顯示Success。后面章節(jié)再加載主體程序。 |
|
|
來自: 啟云_9137 > 《計算機及軟件應用》