正文

汇编的加法代码2007-04-07 19:29:00

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

分享到:

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

.model small

.const
 MAX equ 50  ;加数的最大位数

.data
 a db MAX,MAX dup(?)
 b db MAX,MAX dup(?)
 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

 mov si,offset a
 inc si
 mov byte ptr [si],0dh ;设置哨兵
 inc si

 mov di,offset b
 inc di
 mov byte ptr [di],0dh ;设置哨兵
 inc di
 
scana: cmp byte ptr [si],0dh
 jz scanb
 inc si
 jmp scana

scanb: cmp byte ptr [di],0dh
 jz scanover
 inc di
 jmp scana
 ;开始计算
scanover:
 mov bx,10   ;bh 用来存每次除10后的商(0,1),bl存10
 mov ax,0dh   ;堆栈中的‘哨兵’
 push ax   
 mov cx,0   ;初始化
 ;从 a 中取数存入 dh
next: mov dh,ch
 cmp ch,0dh
 jz nextb
 dec si
 mov dh,byte ptr [si]
 ;从 b 中取数存入 dl
nextb: mov dl,cl
 cmp cl,0dh
 jz calc
 dec di
 mov dl,byte ptr [di]
 ;计算,并将结果存入堆栈中
calc: xor ax,ax   ;清 0
 mov cx,dx   ;保存取数的结果
 cmp dh,0dh
 jz overa
 add al,dh
 sub al,30h   ;ASCLL 码转为 二进制

overa: cmp dl,0dh
 jz overb
 add al,dl
 sub al,30h   ;ASCLL 码转为 二进制

overb: add al,bh
 div bl
 mov bh,al   ;除10后的商
 mov al,ah
 add al,30h   
 mov ah,0   
 push ax   ;除10后的余数(ah)入栈
 cmp cx,0d0dh  ;是否结束
 jnz next

 ;从堆栈中弹出结果并打印
 cmp ax,30h   ;检查最后进栈的是否为 0
 jnz nocarray
 pop dx
nocarray:
 mov dx,offset result
 mov ah,09h
 int 21h
 cmp bh,1   ;检查最后计算是否有进位
 jnz ptnext
 mov ax,31h
 push ax
 
ptnext: pop dx
 cmp dx,0dh
 jz exit
 mov ah,02h
 int 21h
 jmp ptnext
exit:  mov ah,4ch
 int 21h
main endp
 end main

阅读(4919) | 评论(0)


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

评论

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