2015-02-23 54 views
-3

我正在使用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!

+0

我不明白的你问... – m0skit0 2015-02-23 19:22:51

+1

想知道如何进一步乘以32位的事情值来自先前乘法的dx:ax。哎呀,10!已经不适合16位所以是啊。 – Jester 2015-02-23 19:24:37

+0

您想在16位系统(MS-DOS)中将32位数字(DX:AX)与16位数字(AX)相乘。对?请告诉我们您的汇编程序(TASM,MASM,NASM或...)。 – rkhb 2015-02-23 19:25:24

回答

1

我很确定这里有一个重复的地方。当然,这只是基本的数学反正:

result_low = low(input_low * factor) 
result_high = high(input_low * factor) + low(input_high * factor) 

注意节约ax并在必要时dx

+0

你能否写下这个ALP ......它会如此友善。 – unlucy7735 2015-02-23 19:44:22

1

想象一下,你必须用十进制来表示,例如: 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