微机原理实验一两个多位十进制数相加实验试做报告.docx
《微机原理实验一两个多位十进制数相加实验试做报告.docx》由会员分享,可在线阅读,更多相关《微机原理实验一两个多位十进制数相加实验试做报告.docx(9页珍藏版)》请在冰豆网上搜索。
微机原理实验一两个多位十进制数相加实验试做报告
实验一两个多位十进制数相加实验试做报告
【实验目的】
1.熟悉在PC机上建立、汇编、连接、调试和运行汇编语言程序的过程。
2.熟悉和掌握用DEBUG调试程序的方法。
【实验性质】
验证性实验(学时数:
3H)。
【实验内容】
将两个多位十制数相加,要求加数和被加数均以ASCII码形式各自顺序存放在以DATAl和DATA2为首的5个内存单元中(低位在前),结果送回DATAl处。
【实验说明】
汇编语言没有十进制加法指令,ADD/ADC加法指令的运算对象是二进制数,如果要进行BCD码数的加法,需要对结果进行修正。
组合BCD码的加法调整指令为DAA,它针对AL寄存器中的组合BCD码数之和进行修正。
对于未组合BCD码的加法调整指令为AAA(加法的ASCII码调整指令),它将存于AL寄存器中的一位ASCII码数加法运算的结果调整为一位拆开型十进制数,仍保留在AL中,如果向高位有进位(AF=1),则进到AH中。
对于多字节的ASCII码相加,只能从最低位开始逐个字节地进行加法操作,并随即进行调整。
参考程序清单(WJSY
0.ASM):
DATASEGMENT
DATA1DB33H,39H,31H,37H,34H
DATA2DB36H,35H,30H,38H,32H
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVCX,5;计数
MOVSI,0;做指针用,因从DATA1的第一个数取数,故SI=0CLC
NEXT:
MOVAL,DATA1[SI];取被加数给AL
ADCAL,DATA2[SI];取加数和AL相加
AAA;未组合十进制数加法调整指令
MOVDATA1[SI],AL;结果回送至DATA1处
INCSI;修改SI指向下一位数
LOOPNEXT
MOVSI,5;因显示是从高位到低位,故SI=5
L:
ADDDATA1[SI-1],30H;还原成ASCII码
MOVDL,DATA1[SI-1]
MOVAH,02;送显示
INT21H
JNZL
MOVAH,4CH;返回DOS
INT21H
CODEENDS
ENDSTART
运行结果:
75249
上述程序有很多不方便的地方,比如①加数和被加数以低字节在前高字节在后顺序存放在内存单元中,不符合我们日常的习惯,如果改为高字节在前低字节在后的形式存放数据,程序如何改变?
②程序只显示了相加结果,没有显示加数和被加数,如果要求显示加数和被加数,程序如何修改?
③如果按47193+28056=75249格式显示,程序如何修改?
①程序清单(WJSY
1.ASM):
DATASEGMENT
DATA1DB34H,37H,31H,39H,33H;高位在前低位在后
DATA2DB32H,38H,30H,35H,36H
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVSI,5;做加法是从低位开始加,故SI=5
CLC
NEXT:
MOVAL,DATA1[SI-1];取被加数给AL
ADCAL,DATA2[SI-1];取加数和AL相加
AAA;未组合十进制数加法调整指令
MOVDATA1[SI-1],AL;结果回送至DATA1处
DECSI;修改SI指向下一位数
JNZNEXT
L:
ADDDATA1[SI],30H;还原成ASCII码
MOVDL,DATA1[SI]
MOVAH,02;送显示
INT21H
INCSI
CMPSI,5
JNZL
MOVAH,4CH;返回DOS
INT21H
CODEENDS
ENDSTART
运行结果:
75249
②程序清单(WJSY
2.ASM):
DISPMACRO;回车换行宏定义
MOVAH,2
MOVDL,0DH
INT21H
MOVAH,2
MOVDL,0AH
INT21H
ENDM
DATASEGMENT
DATA1DB34H,37H,31H,39H,33H
DATA2DB32H,38H,30H,35H,36H
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVSI,OFFSETDATA1
CALLDISPL
DISP
MOVSI,OFFSETDATA2
CALLDISPL
DISP
MOVSI,5
CLC
NEXT:
MOVAL,DATA1[SI-1]
ADCAL,DATA2[SI-1]
AAA
MOVDATA1[SI-1],AL
DECSI
JNZNEXT
L:
ADDDATA1[SI],30H
MOVDL,DATA1[SI]
MOVAH,02
INT21H
INCSI
CMPSI,5
JNZL
MOVAH,4CH
INT21H
DISPLPROC
MOVBX,0
D1:
MOVDL,[SI+BX]
MOVAH,2
INT21H
INCBXASCII码
;调显示子程序显示被加数;宏调用,回车换行
;调显示子程序显示加数;宏调用,回车换行
;做加法
;还原为
;送显示
;显示子程序
CMPBX,5
JNZD1
RET
DISPLENDP
CODEENDS
ENDSTART
运行结果:
47193
28056
75249
③程序清单(wjsy3a.asm)
DISPMACROM
MOVAH,2
MOVDL,M
INT21H
ENDM
DATASEGMENT
DATA1DB34H,37H,31H,39H,33H
DATA2DB32H,38H,30H,35H,36H
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVSI,OFFSETDATA1
CALLDISPL
DISP'+'
MOVSI,OFFSETDATA2
CALLDISPL
DISP'='
MOVSI,5
CLC
NEXT:
MOVAL,DATA1[SI-1]
ADCAL,DATA2[SI-1]
AAA
MOVDATA1[SI-1],AL
DECSI
JNZNEXT
L:
ADDDATA1[SI],30H
MOVDL,DATA1[SI]
MOVAH,02
INT21H
INCSI
CMPSI,5+”
=”
;显示运算符宏定义
;调显示子程序显示被加数
;宏调用显示“
;调显示子程序显示加数
;宏调用显示“
JNZL
MOVAH,4CH
INT21H
DISPLPROC
MOVBX,0
D1:
MOVDL,[SI+BX]
MOVAH,2
INT21H
INCBX
CMPBX,5
JNZD1
RET
CODEENDS
ENDSTART
运行结果:
47193+28056=75249;显示子程序