最近我試圖弄清楚引導程序如何工作。 我在nasm彙編程序中編寫我的加載程序,並用bochs和軟盤映像進行測試。加載引導程序的第二階段並啓動它
第1階段和第2階段的已編譯二進制文件通過複製加入到一個圖像中。 這張圖片就像我想要的一樣。 512Bytes stage1代碼(包含magicnumber,它加載得很好)以及第二扇區中的512階段2代碼。
但我認爲我的問題是將該部門加載到內存中並跳入內存中。我的代碼有問題嗎?
Stage1.asm
BITS 16
start:
mov ax, 07C0h ; Set up 4K stack space after this bootloader
add ax, 288 ; (4096 + 512)/16 bytes per paragraph
mov ss, ax
mov sp, 4096
mov ax, 07C0h ;Set data segment to where we're loaded
mov ds, ax
mov si,s_version
call print_string
; ## Load stage2
mov si,s_loading
call print_string
xor ax,ax
xor bx,bx
xor cx,cx
xor dx,dx
;read 2nd sector
mov ah,02h
mov al,1 ;read 1
mov ch,0 ;on track 0
mov cl,2 ;2nd sector
mov dh,0 ;head 1
mov dl,0 ;from floppy a
mov bx,09C0h;destination segment
mov es,bx
mov bx,0 ;destination offset
int 13h ;<-- Fails right here
mov si,s_sector
call print_string
;print number of read sectors
add ax, 48
mov ah, 0Eh
int 10h
mov al, 21
mov ah, 0Eh
int 10h
;print the sector's magicnumber (debugging purposes)
mov al, [09C0h+511]
int 10h
xor ax,ax
int 16h
mov si,s_jumping
call print_string
call word 09C0h:0000h
; #### print a string from si
print_string:
push ax
push bx
mov ah, 0Eh
.repeat:
lodsb
cmp al, 0
je .exit
int 10h
jmp .repeat
.exit:
pop bx
pop ax
ret
; ****
; #### define strings
s_version db 'VeOS 0.0.0.1',10,13,0
s_loading db 'Loading Stage2...',10,13,0
s_sector db 'Loading sector...',10,13,0
s_jumping db 'Passing control to Stage2.',10,13,0
; ****
;fillup with zeros
times 510-($-$$) db 0
;boot signature
dw 0xAA55
stage2.asm
BITS 16
start:
mov ax, 09C0h ; Set up 4K stack space after this bootloader
add ax, 288 ; (4096 + 512)/16 bytes per paragraph
mov ss, ax
mov sp, 4096
mov ax, 09C0h ;Set data segment to where we're loaded
mov ds, ax
mov ah, 0Eh
mov al, 21 ;"!"
int 10h
mov ah, 00h
int 16h
jmp $
times 511-($-$$) db 0
;Magicnumber for debugging
db 0x41
我徹底地用Google搜索,沒有發現任何確切描述瞭如何在部門加載到RAM和跳進去。我的程序甚至沒有發現第二部分的Magicnumber。
如果只是對地址進行一些錯誤估計,那會很好。
更新: 當前源代碼,它有一個鎖定的行被標記。我把所有4個主要寄存器設置爲0,而不是純粹的偏執狂。
Update2: 再次當前版本。在設置寄存器和發出int 13h之間沒有任何東西完成。
正如你所說,我設置了bx = 0和cl = 2。現在bochs(或我的代碼)在執行int 13h的時刻鎖定。 Bochs對虛擬軟盤的狀態保持在「閱讀」狀態,沒有任何反應。 但是,感謝您的幫助到目前爲止。要看你的代碼。 – vikenemesh
而'dh = 0',也只是爲了清楚你將'es'設置爲'09c0h'後將'bx'設置爲零,對吧?因爲這種行爲聽起來像是你剛剛重寫了中斷表。無論如何,隨時更新您的問題與更新的源代碼,我會看看。 – user786653
查看上面的更新源代碼。 – vikenemesh