为什么循环递减cx寄存器?

时间:2012-06-22 12:49:40

标签: assembly x86 infinite-loop

我正在尝试使用以下汇编代码将磁盘中的扇区加载到内存中,但是当我向终端找到一些int 0x10时,它无法工作的原因是它陷入了无限循环。我认为循环会自动减少cx寄存器。下面是代码,测试show_message留下来让你看看我是如何得出循环没有递减cx的结论。我看到的是msg_2“仍在循环中”一遍又一遍地不停地结束。

另一个很好的答案是为什么读取永远不会成功(为什么进位标志永远不会清除),因为我非常有信心在调用时寄存器的值很好,但除了那些寄存器的内容之外没有是正确的,如果有人能够看到我在设置int 0x13时做错了,那也会很棒。

最后一点:我知道ch是气缸的低8位,cl的两个高位是气缸的两个高位,而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

2 个答案:

答案 0 :(得分:9)

你正在循环中修改CX:

  mov ch, [CYLNUM]

  mov cl, [SECTNUM]

CX寄存器由CH(高字节)和CL(低字节)组成。

为避免这种情况,您可以尝试在INT调用之前/之后使用CX(或ECX)上的PUSH / POP操作(或者在循环的开始/结束时更好)。

当然,我可能错了 - 我已经在大会上编程了10年。

答案 1 :(得分:0)

“CYLNUM”和其他大写符号实际上是变量,还是它们定义的常量(在某些语言中,常量是“按惯例”大写)。如果它们是变量,那么您的代码看起来还不错。如果它们是常数,则丢失“[]”。

(如果变量,ds设置正确吗?)

最佳, 弗兰克