2015-02-23 62 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