最近、私はブートローダの仕組みにハングアップしようとしています。 私はローダーをnasmアセンブラに書いていて、ボッチとフロッピーイメージでテストしています。ブートローダの第2段階を読み込んで起動する
ステージ1と2のコンパイル済みバイナリは、コピーによって1つのイメージに結合されます。 この画像は私が望むのとまったく同じです。 512Bytesのステージ1コード(マジックナンバーが含まれており、うまくロードされます)と第2セクタの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にセクターをロードし、そこにジャンプする方法を正確に記述し、何も見つかりませんでした。 2番目のセクターのMagicnumberさえ私のプログラマーによって発見されていません。
アドレス上の誤算の場合には大丈夫でしょうか。
更新: 現在のソースコード、ロックアップを行っている行がマークされています。私は純粋なパラノイアのうち4つのメインレジスタを0に設定しました。
更新2: また、現在のバージョン。レジスタの設定とint 13hの発行の間に何もしませんでした。
あなたが言ったように、私はbx = 0とcl = 2に設定しました。今bochs(または私のコード)は、int 13hを実行する瞬間にロックアップします。仮想フロッピーのBochsステータスは「読み込み中」のままであり、何も起こりません。 これまでのご協力ありがとうございます。あなたのコードを見てみましょう。 – vikenemesh
'dh = 0'また、' es'を '09c0h'に設定した後に' bx'をゼロに設定していることを明確にするには、そうですか?その動作は、割り込みテーブルを上書きしたように聞こえるためです。どのような場合でも、更新されたソースコードで質問を更新してみてください。 – user786653
更新されたソースコードについては上記を参照してください。 – vikenemesh