之前寫了一段BIOS啓動代碼,在Bochs中測試啓動的時候失敗。其實當時的代碼出了很多問題,只是文件能夠編譯通過而已。錯誤的代碼如下:
;
; boot.s--bootsect.S framework
;
.globlbegtext,begdata,begbss,endtext,enddata,endbss ;global flag
.text
begtext:
.data
begdata:
.bss
begbss:
.text
BOOTSEG = 0x07c0
entry start
start:
jmpi go,BOOTSEG
go: mov ax,cs
mov ds,ax
mov es,ax
mov [msg1+17],ah ; need to understand
mov cx,#20
mov dx,#0x1004
mov bx,#0x000c
mov bp,#msg1
mov ax,1301
int 0x10
loop0: jmp loop0
msg1: .ascii "Loading system ..."
.byte 31,10;need to understand
.org 510
.word 0xAA55
.text
endtext:
.data
enddata:
.bss
endbss:
其實,這裏面的錯誤有好幾處。其中一處是回車換行的代號錯了,但是這個還不是主要的問題。最主要的問題還是字符串的顯示位置,如果使用十六進制的話現實的效果剛剛好。但是如果使用十進制的話,那麼位置就會回退好多,直接超出顯示區域。這個纔是導致顯示失敗的原因。
僅僅修改顯示位置,代碼修改如下:
;
; boot.s--bootsect.S framework
;
.globlbegtext,begdata,begbss,endtext,enddata,endbss ;global flag
.text
begtext:
.data
begdata:
.bss
begbss:
.text
BOOTSEG = 0x07c0
entry start
start:
jmpi go,BOOTSEG
go: mov ax,cs
mov ds,ax
mov es,ax
mov [msg1+17],ah ; need to understand
mov cx,#20
mov dx,#0x1004
mov bx,#0x000c
mov bp,#msg1
mov ax,#0x1301
int 0x10
loop0: jmp loop0
msg1: .ascii "Loading system ..."
.byte 31,10;need to understand
.org 510
.word 0xAA55
.text
endtext:
.data
enddata:
.bss
endbss:
編譯執行之後的執行效果: