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

mri*_*ing 2 x86 assembly 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
Run Code Online (Sandbox Code Playgroud)

Luk*_*asz 9

你在循环中修改CX:

  mov ch, [CYLNUM]

  mov cl, [SECTNUM]
Run Code Online (Sandbox Code Playgroud)

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

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

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