如何显示存储在 DX:AX 中的 32 位 DIV 结果

How to display a 32-bit DIV result stored in DX:AX

我写这段代码是为了在一些计算后显示当前值。但是当它应该给出十进制 10 结果时,程序给出了错误的输出,它给出了 13107 结果,我找不到原因。在这个标签之前,我所做的基本上是从用户那里获取输入并将这些值存储在 si 寄存器中。

islem: 

  MOV AX,[SI+14]
  MOV BX,[SI+10]
  MOV CX,[SI+2]
  
  SUB AX,BX
  SUB AX,CX
  
  MOV BX,[SI+8]
  
  MOV [SI+16],AX
  
  MOV DX,00H
  MOV AX,[SI+16]
  DIV BX
  
  
  
  MOV [SI+18],OFFSET IE
  
  MOV [SI+18],AX
  MOV [SI+20],DX
  
  CALL NEWLINE
  
  mov dx, offset Ie_msg
  mov ah,9
  int 21h
  
  MOV AX,[SI+18]
  MOV DX,[SI+20]
  

  
    mov     bx,10          ;CONST
    push    bx             ;Sentinel
a: mov     cx,ax          ;Temporarily store LowDividend in CX
    mov     ax,dx          ;First divide the HighDividend
    xor     dx,dx          ;Setup for division DX:AX / BX
    div     bx             ; -> AX is HighQuotient, Remainder is re-used
    xchg    ax,cx          ;Temporarily move it to CX restoring LowDividend
    div     bx             ; -> AX is LowQuotient, Remainder DX=[0,9]
    push    dx             ;(1) Save remainder for now
    mov     dx,cx          ;Build true 32-bit quotient in DX:AX
    or      cx,ax          ;Is the true 32-bit quotient zero?
    jnz     a             ;No, use as next dividend
    pop     dx             ;(1a) First pop (Is digit for sure)
b: add     dl,"0"         ;Turn into character [0,9] -> ["0","9"]
    mov     ah,02h         ;DOS.DisplayCharacter
    int     21h            ; -> AL
    pop     dx             ;(1b) All remaining pops
    cmp     dx,bx          ;Was it the sentinel?
    jb      b             ;Not yet
  



ret
MOV AX,[SI+18]
MOV DX,[SI+20]

您的计算结果来自除法 (div bx)。 商仅保存在 AX 寄存器中 DX 寄存器包含除法的余数。

只需用 mov ax, [si+18] 加载 AX,然后用 xor dx, dx 加载零 DX
以后你可以运行我的转换码...