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