实验二 无符号十进制数加
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验二无符号十进制数加、减法实验
一、实验目的
1.掌握MCS-51汇编语言程序设计和调试方法。
2.熟悉KeilC的使用。
二、实验原理
51单片机具有强的加、减、乘、除四种基本的数学运算功能,这些运算均是直接对8位无符号二进制数而言。利用溢出标志,可以把加、减法操作于有符号的运算;利用十进制调整指令,又可以使运算直接用十进制数(BCD码)来运算。
1.加法有下列四种指令形式:
1)ADD:完成A寄存器和第二数之间的加法,结果送A寄存器中。
2)ADDC:带进位加,同上操作,只是要加上前一次运算的进位CY的值。以上指令均影响到标志位AC、CY、OV,P。
3)DA:十进制调整。若A寄存器低4位的值(和数的低四位)大于9,或辅助进位标志AC=1(即第三位向第四位产生进位),则和数加6,以产生低四位正确的BCD码值。同样,如果A寄存器的高四位的值大于9或CY=1,则高四位加6调整产生正确的高4位BCD码值。加6调整后产生最高进位时,则置位CY。注意:本指令只能紧跟加法指令(ADD或ADDC)的后面,其它无效。
4)INC:将源操作数加1,结果送回操作单元,不影响标志位。
加法指令有如下几条:
ADD A,Rn
ADD A,direct
ADD A,@Ri
ADD A,#data
ADDC A,Rn
ADDC A,direct
ADDC A,@Ri
ADDC A,#data
DA A
INC A
INC Rn
INC DPTR
INC @Ri
INC direct
2.51的减法指令只有两类:
1.SUBB:带借位减。从累加器A减去指定的变量进位标志,结果送回累加器A,它要考虑前一次运算操作对CY的影响。因此,在做多字节减法时,第一次使用SUBB之前应将CY清尽。
2.DEC:将操作数减一,不影响标志。
归纳起来,减法指令有如下几条:
SUBB A,Rn DEC Rn
SUBB A,direct DEC @R
SUBB A,@Ri DEC A
SUBB A,#data DEC direct
由于没有十进制减法指令,为了用十进制加法调整,必须采用补码相加的办法,用9AH减去减数,即得出十为模的减数的补码。
三、实验内容
1.编写并调试一个n字节无符号十进制整数加法程序,其功能为将存放在内部RAM的两个几字节压缩的BCD码(即2n位十进制数)相加,和数存放在R0指出的内部RAM中(原被加数单元),字节数存放于R7。
入口:addr1—被加数低位;addr1+n-1—被加数高位;
addr2—加数低位;addr2+n-1—加数高位;
(R7)=n
出口:addr1—和数(n+1个字节)低位;
addr1+n—和数高位。
例如:被加数存放在…41H、40H单元,加数存放在…51H、50H单元运行结果为(41H)(40H)+(51H)(50H)→(42H)(41H)(40H),(R0)=40H 2.编写并调试一个几字节无符号十进制整数减法实验程序,其功能为将(R0)指出的内部RAM中的n字节无符号压缩BCD码十进制数减去(R1)指出的内部RAM中n字节无符号压缩BCD码十进制数,差送被减数单元。减法子程序入口时,(R0)、(R1)分别指向被减数和减数的低位字节,字节数存放在R7中,出口时R0指向差的低位字节,CY=1为正,CY=0为负,结果为补码。
四、实验内容1程序框图见图2-1
五、实验内容2参考程序如下
ORG 0000H
AJMP MAIN
ORG 0100H
MAIN:MOV R0,#20H
MOV R1,#30H
MOV R7,#04H
ACALL DSUB
HERE:SJMP HERE
DSUB:CLR C
PUSH R0
LOOP:MOV A, #9AH
SUBB A,@R1
ADD A,@R0
DA A
MOV @R0,A
INC R0
INC R1
CPL C
DJNZ R7,LOOP
POP R0
RET
图2-1 十进制加法程序框图
六、调试方法
在KeilC中利用修改寄存器和内部RAM内容的方法,启动系统从实验程序开始运行到最后一条指令。再分别检查相应的出口结果,若有错误,改用单步或断点运行,最后用不同的参数测试程序,直至正确。
七、思考题
实验1若将入口地址从8031内部RAM改为外部扩展RAM,应如何修改程序?
实验2程序中每字节减法做完后指令CPL C意义何在?