簡體   English   中英

將任意長的 ASCII 數字序列乘以一位數乘數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM