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)
你在循环中修改CX:
mov ch, [CYLNUM]
mov cl, [SECTNUM]
Run Code Online (Sandbox Code Playgroud)
CX寄存器由CH(高字节)和CL(低字节)组成.
为避免这种情况,您可以尝试在INT调用之前/之后在CX(或ECX)上使用PUSH/POP操作(或者在循环的开始/结束时更好).
当然,我可能错了 - 我已经没有在大会上编程10年了.