gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 08:59:57 27 4
gpt4 key购买 nike

我正在尝试使用以下汇编代码将磁盘扇区加载到内存中,但正如我在终端中使用一些 int 0x10 时发现的那样,它不起作用的原因是它陷入了无限循环。我以为循环会自动为我递减 cx 寄存器。下面是代码,其中保留了测试 show_message 供您查看我是如何得出循环不递减 cx 的结论的。我看到的是 msg_2 一遍又一遍地“仍在循环”,没有结束。

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

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

最佳答案

您正在循环中修改 CX:

  mov ch, [CYLNUM]

mov cl, [SECTNUM]

CX寄存器由CH(Higher byte)和CL(Lower byte)组成。

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

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

关于assembly - 为什么循环不递减 cx 寄存器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11156505/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com