assembly 用一位乘数乘以任意长的ASCII数字序列

cunj1qz1  于 2022-12-13  发布在  其他
关注(0)|答案(1)|浏览(122)

我将缓冲区中的每个整数相乘,现在需要连接中间结果。
我有这样的代码:(先前在.数据中我声明:(一个月一个月)

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并分别打印

我需要输出看起来像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

输出(有456个输入)是B?<,但我需要它是1368
如果能让它更容易理解的话,我从一个文件中阅读并将其写入另一个文件。

pu82cl6c

pu82cl6c1#

例如,我的缓冲区包含:456
我需要输出看起来像456*3,等于1368
与当前从源字符串末尾开始的方法不同,将数字组合成一个16位整数以备乘法,最好从数字序列的开头开始:

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

相关问题