【问题标题】:Why isn't loop decrementing cx register?为什么循环不递减 cx 寄存器?
【发布时间】:2012-06-24 18:29:43
【问题描述】:

我正在尝试使用以下汇编代码将扇区从磁盘加载到内存中,但我发现终端中有一些 int 0x10,它不起作用的原因是它陷入了无限循环。我认为循环会自动为我递减 cx 寄存器。下面是代码,剩下的测试 show_message 让你看看我是如何得出循环没有递减 cx 的结论的。我看到的是 msg_2 "Still in loop" 一遍又一遍,没有尽头。

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

最后一点:我知道 ch 是柱面的低八位,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

【问题讨论】:

    标签: assembly x86 infinite-loop


    【解决方案1】:

    您正在循环中修改 CX:

      mov ch, [CYLNUM]
    
      mov cl, [SECTNUM]
    

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

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

    当然,我可能错了——我已经有 10 年没有用汇编编程了。

    【讨论】:

    • 啊,当然! CX = CHCL,对吧?我将它们视为三种不同的东西,却忘记了 CX 是它们两者的名称。所以当你一般使用 CH 和/或 CL 时,你不能使用循环指令,我想。
    • @Pete 看看我的回答——好吧,你可以使用堆栈(PUSH/POP)来临时存储 CX 值。
    • 谢谢。现在我逃脱了那个无限循环,但读取永远不会成功。我想我需要 100% 确保我的驱动器、磁头、柱面和扇区号是正确的,因为读取永远不会成功。
    • 注意:驱动器、柱面和磁头编号从零开始,但第一个扇区是扇区 1。
    【解决方案2】:

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

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

    最好, 弗兰克

    【讨论】:

      猜你喜欢
      • 2019-03-26
      • 2020-03-10
      • 1970-01-01
      • 2021-07-01
      • 2016-11-25
      • 2013-05-04
      • 1970-01-01
      • 2016-03-07
      • 2020-09-14
      相关资源
      最近更新 更多