此问题在此处已有答案:
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单词以输出正确的结果?
1条答案
按热度按时间tct7dpnv1#
有关在DX:AX中显示32位值的详细说明,请参阅Displaying numbers with DOS。
所以,虽然你的问题是重复的,请阅读以下关于你目前的16位转换:
字符串
在使用
div bx
指令之前,您不应该使用cwd
。AX完全可能包含32768到65535范围内的值。应用cwd
将用FFFFh填充DX,并且它将产生错误的结果!始终写入xor dx, dx
。型
BX中的值在循环运行时不会改变,所以最好把它放在循环的 * 外部 *。把它放在 *
@IterateMulLo:
的 * 上面。型
这是一条冗余指令。在除以10之后,整个DX寄存器包含一个范围为0到9的值。DH肯定是0。
型
这是正确的,但通常的编写方法是在非零条件下用自身和分支测试AX。
型