正文

汇编的加法代码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 retPtEnter endp ;------------------------------------------------------------------;在提示下输入数据,提示信息为 si ,数据输入到 di;------------------------------------------------------------------GetData proc near mov dx,si mov ah,09h int 21h     mov dx,di mov ah,0ah int 21h call PtEnter retGetData 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 中取数存入 dhnext: mov dh,ch cmp ch,0dh jz nextb dec si mov dh,byte ptr [si] ;从 b 中取数存入 dlnextb: 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 dxnocarray: 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 ptnextexit:  mov ah,4ch int 21hmain endp end main

阅读(5087) | 评论(0)


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

评论

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