我正在尝试使用以下汇编代码将磁盘中的扇区加载到内存中,但正如我发现终端的一些 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