assembly 组合16位 * 16位乘法的结果以输出32位值[重复]

r6hnlfcb  于 11个月前  发布在  其他
关注(0)|答案(1)|浏览(96)

此问题在此处已有答案

Displaying numbers with DOS(1个答案)
关闭21天前.

mov ax, [integerOp1]
    mul [integerOp2]
    
    mov resultHi, dx
    mov resultLo, ax
    
     ;Integer -> ASCII
    
    
    mov cx, 0       ; Count for digits in result
    @IterateMulLo:       
    cwd             ; Preventing Division Overflow
    mov bx, 10
    
    div bx          ; Dividing by 10 to get the digits of result as remainder
    
    mov dh, 00h     ; Clearing dh so dx conatins just the digit
    
    add dl, 30h     ; Converting digit in dl to ASCII
    
    push dx         ; Pushing the ASCII to stack
    
    inc cx          ; Increment digit count 
    
    cmp ax, 0       ; Repeating process until quoteint reaches 0. i.e: no more digits left
    jg @IterateMulLo
    
    mov digitCount, cx  
    
    mov ax, resultHi
    @IterateMulHi:       
    cwd             ; Preventing Division Overflow
    mov bx, 10
    
    div bx          ; Dividing by 10 to get the digits of result as remainder
    
    mov dh, 00h     ; Clearing dh so dx conatins just the digit
    
    add dl, 30h     ; Converting digit in dl to ASCII
    
    push dx         ; Pushing the ASCII to stack
    
    inc cx          ; Increment digit count 
    
    cmp ax, 0       ; Repeating process until quoteint reaches 0. i.e: no more digits left
    jg @IterateMulHi
    
    mov digitCount, cx
    
    jmp @Result

这是我在动车组8086中用于两个16位数字相乘的代码。乘法mul [integerOp2]将结果存储在DX(Hi字)和AX(Lo字)中。如果我们以1234 * 1234(十进制)为例。DX中的值为0017,AX中的值为3C44(十六进制)寄存器中的值在组合时产生00173C44(十六进制)= 1,522,756(十进制),这是正确的结果。然而,我把这些值分别推到堆栈,然后弹出显示结果给我2315428,这是DX = 0017(十六进制)= 23和AX = 3C44(十六进制)= 15428(十进制)。
因此,通过分别处理这些值,同时输出结果显示不正确的答案。我如何将合并组合lo和hi单词以输出正确的结果?

tct7dpnv

tct7dpnv1#

有关在DX:AX中显示32位值的详细说明,请参阅Displaying numbers with DOS
所以,虽然你的问题是重复的,请阅读以下关于你目前的16位转换:

cwd             ; Preventing Division Overflow

字符串
在使用div bx指令之前,您不应该使用cwd。AX完全可能包含32768到65535范围内的值。应用cwd将用FFFFh填充DX,并且它将产生错误的结果!始终写入xor dx, dx

mov bx, 10


BX中的值在循环运行时不会改变,所以最好把它放在循环的 * 外部 *。把它放在 * @IterateMulLo:的 * 上面。

mov dh, 00h     ; Clearing dh so dx conatins just the digit


这是一条冗余指令。在除以10之后,整个DX寄存器包含一个范围为0到9的值。DH肯定是0。

cmp ax, 0       ; Repeating process until quoteint reaches 0. i.e: no more digits left
jg @IterateMulLo


这是正确的,但通常的编写方法是在非零条件下用自身和分支测试AX。

test ax, ax
jnz  @IterateMulLo

相关问题