1

フロッピー ディスクの 2 番目のセクタを読み込もうとしています

このコードを fasm 1.7 と Windows 7、VMware でテストします。フロッピー イメージ ファイルを作成するために、ddUbuntu 13.04 から使用ddしました。.bin.img

これが私のコードです

org 0x7c00

;load 2nd sector to physical ram address 0xf00
;(load '7' to 0xf00)
mov ah, 02h
mov al, 1
mov ch, 0
mov cl, 2;1~63
mov dh, 0
mov dl, 0
mov bx, 0xf00
push 0
pop es
int 13h

;check whether it is loaded correctly
;by printing a ascii character in 0xf00
mov ah,0fh
int 10h
mov ah,0ah
mov al, [0xf00];
mov cx, 1
int 10h

;pause
jmp $

times 510-($-$$) db 0h
dw 0xaa55

second_sector:
db '7'

結果 = '7' をまったく出力しない 何が問題なのですか? ありがとう

4

1 に答える 1

1

問題は次の行にあるというフランク・コトラーの評価は正しいです。

mov al, [0xf00];

セグメントが設定されていない場合、[0xf00]は暗黙的に[ds:0xf00]になります。この StackOverflow の回答では、一般的なブートローダー開発のヒントをいくつか紹介します。ヒント 1:

BIOS がコードにジャンプするとき、CS、DS、ES、SS、SP レジスタが有効な値または期待される値を持つことに依存することはできません。ブートローダーの起動時に適切に設定する必要があります。ブートローダーがロードされ、物理アドレス 0x00007c00 から実行されること、およびブート ドライブ番号が DL レジスタにロードされることのみが保証されます。

ESを 0 に設定します。

push 0
pop es

次のように、メモリ オペランドにセグメント レジスタを明示的に設定するオプションがあります。

mov al, [es:0xf00]

または、起動時にDSを 0 に設定します。これらを削除します。

push 0
pop es

これをコードの先頭に追加します。

xor ax, ax    ; Zero out ax
mov es, ax
mov ds, ax

SS:SP (スタック) の場所は、ディスク セクタを読み取るメモリと競合すると想定する必要があります。そのため、干渉されない場所にSS:SPを設定することをお勧めします。アクティブ スタック上でディスク データを読み取ると、エラーが発生します。例については、前述の Stackoveflow の回答へのリンクを参照してください。

于 2015-11-17T17:53:59.517 に答える