2

次のアセンブリ コードを使用して、ディスクからメモリにセクタをロードしようとしていますが、端末に 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
4

2 に答える 2

9

ループで CX を変更しています。

  mov ch, [CYLNUM]

  mov cl, [SECTNUM]

CX レジスタは、CH (上位バイト) と CL (下位バイト) で構成されます。

これを回避するには、INT 呼​​び出しの前/後に (またはループの開始/終了時に) CX (または ECX) で PUSH/POP 操作を使用してみてください。

もちろん、私は間違っているかもしれません - 私は 10 年間アセンブリでプログラミングしていません。

于 2012-06-22T13:00:26.723 に答える
0

「CYLNUM」およびその他の大文字の記号は実際には変数ですか、それとも定義された定数ですか(定数は「慣例により」一部の言語では大文字です)。それらが変数の場合、コードは問題ないように見えます。定数の場合は、「[]」を失います。

(変数の場合、dsは正しく設定されていますか?)

最高、フランク

于 2012-06-22T22:25:50.880 に答える