正文

乘法代码(汇编)2007-06-22 19:04:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/lingdlz/27021.html

分享到:

;计算 a * b,其中a b的位数可以在 1 - 2^8 之间,默认位数为 50
;注意 a,b 必须为正数否则结果不正确
;******************************************************************

.model small
.const
 MAX equ 50    ;乘数的最大位数
.data
  a db MAX,MAX dup(0)
  b db MAX,MAX dup(0)
  r db MAX+MAX+1 dup(0)
  txta db 'Enter a:$'
  txtb db 'Enter b:$'
  result db 'a * b = $'
  enter db 13,10,'$'
.code

;------------------------------------------------------------------
;子程序,在屏幕上打印回车
;------------------------------------------------------------------
PtEnter proc near
  mov dx,offset enter
  mov ah,09h
  int 21h
  ret
PtEnter endp

;------------------------------------------------------------------
;在提示下输入数据,提示信息为 si ,数据输入到 di
;------------------------------------------------------------------
GetData proc near
  mov dx,si
  mov ah,09h
  int 21h   
  mov dx,di
  mov ah,0ah
  int 21h
  call PtEnter
  ret
GetData endp

;------------------------------------------------------------------
;主过程
;------------------------------------------------------------------
main proc far
  mov ax,@data
  mov ds,ax
  ; 从键盘接收输入,注意这里没有对输入进行检查
  mov si,offset txta
  mov di,offset a
  call GetData
 
  mov si,offset txtb
  mov di,offset b
  call GetData
 ;准备从 a 中取数
  mov si,offset a
  inc si
 mov ax,0
  mov al,byte ptr[si]
 mov byte ptr[si],0dh ;设置哨兵
  add si,ax
 ;准备从 b 中取数
  mov di,offset b
  inc di
 mov dx,0
  mov dl,byte ptr[di]
 mov byte ptr[di],0dh ;设置哨兵
  add di,dx
 ;初始化结果 r
 mov bx,offset r
 add bx,ax
 add bx,dx
 inc bx
 mov byte ptr[bx],'$'
 dec bx
  ;开始计算
 mov ch,10
scana:  mov cl,byte ptr[si]
 dec si
 cmp cl,0dh
 jz  putout
 sub cl,30h
 push di
 push bx
 mov dx,0
scanb:  mov al,byte ptr[di]
 dec di
 cmp al,0dh
 jz  next
 sub al,30h
 mul cl
 add ax,dx
 add al,byte ptr[bx]
 div ch   ;ch 里存的是10 计算时 ch 不变
 mov dl,al  ;商在 al 里作为下次计算的进位
 mov byte ptr[bx],ah
 dec bx
 jmp scanb
 ; 最后的进位处理
next:   cmp dl,0
 jz  dlzero
 mov al,dl
 mov byte ptr[bx],al
 jmp dlnotzero
dlzero: inc bx
dlnotzero:mov dx,bx
 pop bx
 pop di
 dec bx
 jmp scana

putout: mov bx,dx
 push bx
 ; 将结果转换为 ascii 码形式
nextr: mov al,byte ptr[bx]
 cmp al,'$'
 jz  printr
 add al,30h
 mov byte ptr[bx],al
 inc bx
 jmp nextr
 ; 输出结果
printr: pop bx
 mov dx,offset result
 mov ah,09h
 int 21h
 mov dx,bx
  mov ah,09h
  int 21h
 ; 返回 DOS
   mov ah,4ch
  int 21h
main  endp
  end main

 

阅读(4231) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册