我正在使用8086模拟器和DOSBOX和MASM。
我知道当我们将8位乘以8位时,答案将为16位。
al*(8-bit)=ax
当我们将16位与16位相乘时,将回答32位。
ax*(16-bit)=dx & ax
但如果答案在(dx & ax)
并且我想要乘以8位或16位数字,那么它只会用ax执行但是我需要将数字与(dx & ax)
中的答案相乘。那么如何克服这个问题?
我需要为阶乘计划解决这个问题。我想在哪里找到10个!
答案 0 :(得分:1)
我很确定已经有一个重复的地方了。当然,无论如何它只是基础数学:
result_low = low(input_low * factor)
result_high = high(input_low * factor) + low(input_high * factor)
请注意根据需要保存ax
和dx
。
答案 1 :(得分:1)
想象一下你必须在十进制系统中这样做,例如37 * 8
。您可以计算并添加两个字词:30 * 8
+ 7 * 8
。第一个术语可以转换为3 * 8 * base (10)
。
37 * 8
------
56 (7*8)
24 (3*8)
======
296
您看到“base”的位置为空,因为此值始终为0.
现在让我们将base 10更改为base“register”:
DX:AX * CX
----------
DX:AX (AX*CX)
DX:AX (DX*CX)
==========
XX:XX:XX
结果需要两次乘法和三个单词。此外,您必须存储第一次乘法的结果(DX:AX),因为您需要第二次乘法的寄存器。
这是10的代码!我省略了结果最左边的单词,因为3628800不需要它:
.MODEL SMALL
.STACK 1000h
.DATA
Result DD 1 ; 01 00 00 00 (little endian!)
.CODE
main PROC
mov ax, @DATA ; Initialize DS
mov ds, ax
mov cx, 2 ; Start value
L1:
mov ax, WORD PTR Result + 0 ; Low word
mul cx
mov di, dx ; Store high result
mov WORD PTR Result + 0, ax ; Low result won't be changed anymore
mov ax, WORD PTR Result + 2 ; High word
mul cx
add ax, di ; add low result from last mul to low result here
mov WORD PTR Result + 2, ax ; Store it
; adc dx, 0 ; this would store the "highest" word of result (13!)
; mov WORD PTR Result + 4, dx
add cx, 1
cmp cx, 10
jbe L1 ; While CX <= 10
mov ax, 4C00h
int 21h
main ENDP
END main