[英]Multiplying arbitrarily long sequences of ASCII digits by a single-digit multiplier
我正在乘以緩沖區的每個 integer,現在我需要連接中間結果。
我有這個代碼:(以前我在.data中聲明: count db 0
)
MOV cx, ax
MOV si, offset skBuf
MOV di, offset raBuf
add si,ax
dec si
work:
MOV dl, [si]
sub dl,48
mov bl,dl
mov al,3 ;can be changed by 0-9
mul bl
mov dl,al
add dl,48
divide:
cmp dl,09H ;compares with 9
jbe pabaiga
ja decomposition
decomposition:
mov ax,dx
mov bl, 10
div bl ;al=ax/bl ah=ax%bl
MOV [di], ah
mov dl,al
add dl,count
mov count,al
add count,48
dec si
inc di
LOOP work
我覺得我做錯了什么。
基本上如果你不明白:
例如我的緩沖區包含:456
現在沒有代碼的除法部分,它會將每個數字乘以 3,因此:
6*3
並打印出來5*3
並打印出來4*3
並單獨打印我需要 output 看起來像456*3
等於 1368
現在使用以下代碼:
MOV cx, ax
MOV si, offset skBuf
MOV di, offset raBuf
add si,ax
dec si
work:
MOV dl, [si]
sub dl,48
mov bl,dl
mov al,3 ;galima pakeisti
mul bl
mov dl,al
add dl,48
MOV [di], dl
dec si
inc di
LOOP work
output(456 輸入)是B?<
但我需要它是1368
如果它能讓它更容易理解,我正在從一個文件中讀取並將其寫入另一個文件。
例如我的緩沖區包含:456
我需要 output 看起來像 456*3 等於 1368
與您當前從源字符串末尾開始的方法相反,將數字組合成 16 位 integer 准備乘法,最好從數字序列的開頭開始:
mov cx, ax
mov si, offset skBuf
mov di, offset raBuf
xor ax, ax
xor bx, bx
work:
mov dx, 10
mul dx ; AX = 0 then AX = 40 then AX = 450
mov bl, [si]
inc si
sub bl, 48
add ax, bx ; AX = 4 then AX = 45 then AX = 456
loop work
mov dx, 3
mul dx ; AX = 1368
然后使用Displaying numbers with DOS中的代碼片段之一,您可以自由修改它以將其存儲到目標緩沖區中。
他們希望我對幾乎任何大小的數字進行相同的計算:/這就是為什么我發帖要求通過手工完成你提到的確切事情我猜。 你有什么想法如何使用它嗎? 這幾乎是我一開始問的,但也許我的問題措辭不正確
然后你需要一個單位數乘數的長乘法。 這次最簡單的方法是從數字序列的末尾開始,並將結果存儲到目標緩沖區的末尾,該緩沖區應該有 1 個額外字符的空間!
mov bx, ax ; Length source
lea si, skBuf[bx - 1]
lea di, raBuf[bx]
xor cl, cl ; Clear our carry
work:
mov al, [si] ; Read character
dec si
sub al, 48 ; AL is [0,9]
mov ah, 3
mul ah ; (digit * 3) -> AX is [0,27]
add al, cl
aam ; (digit * 3) % 10 -> AL is [0,9]
; (digit * 3) / 10 -> AH is [0,2]
add al, 48
mov [di], al ; Write character
dec di
mov cl, ah ; (digit * 3) / 10 -> CL is carry [0,2]
dec bx
jnz work
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.