加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

汇编语言:实现加法

(2007-05-11 23:02:25)
 大一学C语言时,都感觉很难.现在学汇编时,就觉得以前的C语言就是1+1=?
这几天老师叫我们用汇编语言实现加法,在网上找了一些,自己做了修改....
此为汇编语言实现20位数加法的程序(非组合BCD码加法)
已调试通过:
DATA    SEGMENT
STR1 DB 'Please input the two numbers:',13,10,'$'
STR2 DB  13,10,'$'
STR3 DB  13,10,'Continue? [Y/N] ','$'
FIRST DB 40 DUP(0);为被加数分配空间
SECOND DB 40 DUP(0);为加数分配空间
SUM     DB      40 DUP(0);为和分配空间
DATA    ENDS
CODE    SEGMENT
 ASSUME CS:CODE,DS:DATA
START:
 MOV AX,DATA
 MOV DS,AX
 LEA DX,STR1
 MOV AH,09    
 INT 21H        ;显示字符串1
 MOV SI,OFFSET FIRST+20    ;SI指向被加数地址中部
 MOV BX,OFFSET SECOND+20  ;BX指向加数地址中部
 MOV CX,00      ;CX初始为0
INPUT1:
 MOV AH,01
 INT 21H        ;输入字符
 AND AL,0FH     ;转换成非组合的BCD码
 MOV [SI],AL
 CMP AL,0DH     ;用回车判断是否输入结束
 JE L1         ;输入结束,转L1
 INC SI         ;输入未结束,则继续输入
 INC CL         ;用CL为被加数的位数计数
 JMP INPUT1
L1:
 LEA DX,STR2  
 MOV AH,09
 INT 21H        ;回车换行   
 MOV DL,'+'   
 MOV AH,02    
 INT 21H        ;显示器输出字符'+'
 LEA DX,STR2
 MOV AH,09
 INT 21H    ;回车换行
INPUT2: MOV AH,01
 INT 21H        ;输入字符
 AND AL,0FH     ;转换成非组合的BCD码
 MOV [BX],AL
 CMP AL,0DH     ;用回车判断是否输入结束
 JE L2         ;输入结束,转L2
 INC BX         ;输入未结束,则继续输入
 INC CH         ;用CH为被加数的位数计数
 JMP INPUT2
L2:
 LEA DX,STR2
 MOV AH,09
 INT 21H        ;回车换行 
 MOV DL,'='
 MOV AH,02
 INT 21H        ;显示器输出字符'='
 AND AX,00H     ;AX置0
 DEC SI
 DEC BX
 MOV DI,OFFSET SUM     ;DI指向和数
 CLC                ;CF置0
 CMP CL,CH      ;比较被加数和加数的位数
 JGE L4         ;如果被加数位数不小于加数位数,转L4
 JL L3        ;如果被加数位数小于加数位数,转L3
L3:
 MOV CL,CH    
 JMP L4      
L4:
 AND CH,0       ;置CX为被加数和加数的位数中大的
 INC CX         ;CX加1,考虑最高位可能进位
 STD                ;置DF为1
 JMP L5
L5:
 LODSB              ;被加数载入,SI自动递减
 ADC AL,[BX]    ;带进位的加法
 AAA     ;十进制调整
 MOV [DI],AL    ;将所加的数装入DI所指示的和处
 INC DI         ;DI自增
 DEC BX         ;BX自减
 LOOP L5         ;循环
L6:
DEC DI
 MOV DL,[DI]
 CMP DL,00H     ;首先判断最高位是否为0
 JE L7         ;最高位为0,转L7
 JNE L8         ;最高位不为0,转L8
L7:
 JMP L6         ;最高位为0,跳过
L8:
INC DI         ;最高位不为0,重新开始
 JMP L9
L9:
DEC DI
 MOV DL,[DI]
 OR DL,30H     ;转换成ASCII码
 MOV AH,02H
 INT 21H        ;输出和数
 MOV AX,OFFSET SUM    ;将和数的地址偏移量装入AX
 CMP DI,AX      ;比较AX和DI,判断输出是否应结束
 JE L10         ;输出完毕
 JMP L9         ;输出未结束,继续输出
L10:
 LEA DX,STR3
 MOV AH,09
 INT 21H        ;询问是否需要继续进行
 MOV AH,01
 INT 21H
 CMP AL,59H     ;判断是否需要继续进行
 JE L11
 JNE L12
L11:
 LEA DX,STR
 MOV AH,09
 INT 21H
 JMP START      ;继续进行
L12: 
 MOV AH,4CH
 INT 21H      
CODE    ENDS
        END    START
 
 

0

阅读 收藏 喜欢 打印举报/Report
后一篇:钱...
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有