在汇编语言程序中连续两次相乘

时间:2015-02-23 19:17:24

标签: assembly x86 masm multiplication

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

2 个答案:

答案 0 :(得分:1)

我很确定已经有一个重复的地方了。当然,无论如何它只是基础数学:

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

请注意根据需要保存axdx

答案 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