我正在尝试使用以下汇编代码将磁盘中的扇区加载到内存中,但是当我向终端找到一些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
答案 0 :(得分:9)
你正在循环中修改CX:
mov ch, [CYLNUM]
mov cl, [SECTNUM]
CX寄存器由CH(高字节)和CL(低字节)组成。
为避免这种情况,您可以尝试在INT调用之前/之后使用CX(或ECX)上的PUSH / POP操作(或者在循环的开始/结束时更好)。
当然,我可能错了 - 我已经在大会上编程了10年。
答案 1 :(得分:0)
“CYLNUM”和其他大写符号实际上是变量,还是它们定义的常量(在某些语言中,常量是“按惯例”大写)。如果它们是变量,那么您的代码看起来还不错。如果它们是常数,则丢失“[]”。
(如果变量,ds设置正确吗?)
最佳, 弗兰克