次のアセンブリ コードを使用して、ディスクからメモリにセクタをロードしようとしていますが、端末に int 0x10 を使用してわかったように、機能しない理由は、無限ループに陥っているからです。loop が cx レジスタを自動的にデクリメントしたと思いました。以下はコードです。テスト show_message が残されているため、ループが cx をデクリメントしていないという結論にどのように到達したかを確認できます。私が見ているのは、msg_2「まだループ中です」が何度も何度も終わりません。
もう1つの優れた答えは、呼び出し時にレジスタの値が適切であると確信しているため、読み取りが成功しない理由(キャリーフラグがクリアされない理由)ですが、レジスタの内容が正しくないことを除いて、 int 0x13 の設定で私が何か間違ったことを誰かが見ることができれば、それも素晴らしいことです。
最後の注意: ch はシリンダーの下位 8 ビット、cl の上位 2 ビットはシリンダーの上位 2 ビット、cl の下位 6 ビットはセクター番号であることを知っています。私のデータはシリンダー 0、セクター 2 にあるので、[CYLNUM] は 0x00、[SECTNUM] は 0x02 です。
;;;Load Memory;;;
load_mem:
mov cx, 3 ;Try to read the drive 3 times
read_loop:
xor ah, ah ;ah=0, reset drive
int 0x13 ;Call drive reset
mov ax, [SYSADDR]
mov es, ax ;Destination- es:bx
mov bx, 0
mov dl, [DRIVENUM]
mov dh, [HEADNUM]
mov al, [NUMKERNELSECTS]
mov ch, [CYLNUM]
mov cl, [SECTNUM]
mov ah, 0x02 ;ah=2, read drive
int 0x13 ;Call read interrupt
jnc exit ;If carry flag is clear, exit
;;test;;
mov si, msg_2
call show_message
;;test;;
loop read_loop
mov si, read_error ;Failed 3 times
call show_message
hang:
jmp hang ;hang for now
exit:
ret