我正在使用8086模拟器和DOSBOX和MASM。在汇编语言程序中连续两次乘以
我知道,当我们将8位乘以8位时,答案将是16位。
al*(8-bit)=ax
而当我们将16位乘以16位时,答案将为32位。
ax*(16-bit)=dx & ax
,但如果答案是(dx & ax)
,我要乘8位或16位号码,然后它会简单地用斧头执行,但我需要(dx & ax)
繁殖了许多与答案。那么如何克服这个问题呢?
我需要为阶乘程序解决这种情况。我在哪里试图找到10!
我正在使用8086模拟器和DOSBOX和MASM。在汇编语言程序中连续两次乘以
我知道,当我们将8位乘以8位时,答案将是16位。
al*(8-bit)=ax
而当我们将16位乘以16位时,答案将为32位。
ax*(16-bit)=dx & ax
,但如果答案是(dx & ax)
,我要乘8位或16位号码,然后它会简单地用斧头执行,但我需要(dx & ax)
繁殖了许多与答案。那么如何克服这个问题呢?
我需要为阶乘程序解决这种情况。我在哪里试图找到10!
我很确定这里有一个重复的地方。当然,这只是基本的数学反正:
result_low = low(input_low * factor)
result_high = high(input_low * factor) + low(input_high * factor)
注意节约ax
并在必要时dx
。
你能否写下这个ALP ......它会如此友善。 – unlucy7735 2015-02-23 19:44:22
想象一下,你必须用十进制来表示,例如: 37 * 8
。你会计算并添加两个条款:30 * 8
+ 7 * 8
。第一项可以转换为3 * 8 * base (10)
。
37 * 8
------
56 (7*8)
24 (3*8)
======
296
你看的“基地”的地方是空的,因为这个值始终为0
现在让我们改变基地10基地“注册”:
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
我不明白的你问... – m0skit0 2015-02-23 19:22:51
想知道如何进一步乘以32位的事情值来自先前乘法的dx:ax。哎呀,10!已经不适合16位所以是啊。 – Jester 2015-02-23 19:24:37
您想在16位系统(MS-DOS)中将32位数字(DX:AX)与16位数字(AX)相乘。对?请告诉我们您的汇编程序(TASM,MASM,NASM或...)。 – rkhb 2015-02-23 19:25:24