Assembly 8086组装-DIV变成猿类,IP无休止地跳到一个奇怪的位置

Assembly 8086组装-DIV变成猿类,IP无休止地跳到一个奇怪的位置,assembly,x86,x86-16,tasm,Assembly,X86,X86 16,Tasm,我被这个问题困扰了一天,找不到任何相关信息 我的代码中有一个部分,它接受一个数字(例如259)并将其数字分隔到数组槽中 SEPERATE_DIGITS: mov ax,RESULT ; result is the number im working on. RESULT dw 259h mov si,0 SEPERATE_DIGITS_LOOP: div TEN ; TEN dw 10h

我被这个问题困扰了一天,找不到任何相关信息

我的代码中有一个部分,它接受一个数字(例如259)并将其数字分隔到数组槽中

SEPERATE_DIGITS:
    mov ax,RESULT               ; result is the number im working on. RESULT dw 259h
    mov si,0
    SEPERATE_DIGITS_LOOP:
        div TEN                 ; TEN dw 10h
        add dl,30h              ; fix-up to print later on
        mov SEPERATED[si],dl    ; store separated digit in my array.
        inc si
        cmp ax,0
    jne SEPERATE_DIGITS_LOOP
我一直在用turbo调试器调试它。。 第一组运作良好。(25到ax,9到dx)。。 下一个师,IP变成了猿猴,只是在一个无休止的循环中一次又一次地跳到命令“DBFE”


我到底做错了什么?q:

这里DIV的被除数是从DX(前16位)和AX(低16位)中获取的32位值。
您需要在每个DIV之前将DX归零,以避免将余数作为红利的一部分重用


另外,开始使用调试器。这很有帮助。

你知道
259
259h
之间的区别吗?259h是十六进制的。我相信259是十进制的。(相当于259d)@IgalKlebanov:它必须是259,因为你想要9,5和2。如果是259h,等于601,你会得到1,0和6。@Alex:他会得到9,5和2,因为他除以10h。@Gabe,哦,你完全正确。谢谢!它起作用了。错误地认为div只是覆盖了目标寄存器(dx,ax)中的任何内容。它确实覆盖了所有内容,这就是问题的原因。@IgalKlebanov:确保正确的答案被标记为答案。每个问题的答案旁边都有一个复选标记。