Bochs上運行BIOS啓動失敗原因分析

       之前寫了一段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:

       編譯執行之後的執行效果: