第三章3(指令系统2)
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
带进位加法(ADDC):A(A)+(Cy)+(第二操作数)带 借位减法(SUBB):A(A)-(Cy)-(第二操作数)
《单片机原理与应用技术》教学课件
1、不带进位的加法指令
格式:
ADD A, Rn ;A+Rn→A ADD A, direct ;A+(direct)→A ADD A, @Ri ;A+(Ri)→A ADD A, #data ;A+data→A 【注意】: 1)参加运算的数据都应当是8位的,结果也是8位并影 响PSW。 2)根据编程者的需要,8位数据可以是无符号数(0~ 255),也可以是有符号数(-128~+127)。 3)不论数据是有符号数还是无符号数,CPU都将它们 视为有符号数(补码)进行运算并影响PSW。
《单片机原理与应用技术》教学课件
指令 “DA
A” 完成的操作:
若(A)3~09或AC=1则(A)3~0(A)3~0+6; 若(A)7~49或CY=1则(A)7~4(A)7~4+6; 例:两个十进制数“65”与“58”相加,根据常识, 显然其和应当为“123”。 MOV ADD DA
A,#65H A,#58H A
6 + 5 + 6
5 8 6 1
0110 0101 0101 1000 1011 1101 0110 0110 0010 0011
结果:A= 23H CY= 1
《单片机原理与应用技术》教学课件
又如:两个十进制数“39”与“58”相加,根据常 识,显然其和应当为“97”。 MOV ADD DA A,#39H A,#58H A 3 + 5 9 0011 1001
±1
±1
Rn 寄存器
#data 立即数
DPTR
+1
MUL AB DIV AB DA A
算术运算指令示意图
1、加法运算: 2、带进位加法运算: 3、带借位减法运算:
(ADD——4条) (ADDC——4条) (SUBB——4条)
所有的加法(ADD)、带进位加法(ADDC)、带借位减 法(SUBB)运算都是以 A为一个加数或被减数,最终 结果也存进 A ,此三指令对标志位有影响。 加法(ADD)、带进位加法(ADDC) 以及带借位减法 (SUBB)运算中,如果产生了进位或借位,将自动对 PSW中的Cy标志位置“1” 。
不带进位的加法指令举例(一)
分析执行下列指令后累加器A和PSW中各标志的变化。
MOV A, #19H ADD A, #66H 25 A= 0 0 0 1 1 0 0 1 B + 102 data= 0 1 1 0 0 1 1 0 B 127 cy 0 0 1 1 1 1 1 1 1 B
C7’ C6’ 0 0
【注意】:这里的Cy是指令执行前的Cy; 对PSW的影响同ADD指令。
3、带进位的减法指令
格式: SUBB A, Rn ;A – Rn – Cy →A SUBB A, direct ;A – (direct) – Cy →A SUBB A, @Ri ;A – (Ri) – Cy →A SUBB A, #data ;A – data – Cy →A
编程举例
已知30H、40H单元中存有两个16位无符号数X1、X2
(低位在前)。试写出X1+X2,并将结果放入30H、 31H单元(低8位在30H单元)。设两数之和不会超 过16位(65535)。
【解】: MOV R0,#30H ;赋初值 MOV R1,#40H ;赋初值 MOV A,@R0 ;取x1低8位送A ADD A,@R1 ;x1与x2低8位相加 MOV @R0,A ;低8位和送m1单元 INC R0 INC R1 ;修改指针 MOV A,@R0 ;取x1的高8位送A ADDC A,@R1 ;高8位和Cy相加 MOV @R0,A ;结果送M1+1单元 RAM
6、单字节乘/除运算:
(MUL,DIV——2条)
两个单字节无符号数的乘/除法运算只在A与 B之间进行。
MUL
DIV
AB; A与B相乘, 积为16位数, A积的低8位; B积的高8位 AB; A除以B,结果用2字节表示, A商的整数部分;B余数
《单片机原理与应用技术》教学课件
【注意】:指令对标志的影响:
C7’ C6’ AC
4、加1指令
格式:
INC INC INC INC INC
A Rn direct @Ri DPTR
;累加器A加一 ;Rn+1→Rn ;内存单元数据加一 ;内存单元数据加一 ;dptr+1→dptr
【注意】: 1)除了第一条对PSW的P有影响外,其余对PSW均 无影响。 2)由于上面的原因,INC指令不能作为一般的数据 算术运算使用,INC主要用于修改数据指针等控制、 循环语句中使用。
AC 0
Cy=0 AC=0 OV=0 P=1
1)若两数是无符号数,Cy=0无溢出,25+102=127 2)若两个数是有符号数,则因OV=0无溢出。
对于无符号数相加、减时,若Cy置位
(为1),说明运算结果产生溢出。
对于有符号数相加、减时,当位6和位7
只有一位进位(或借位)时,OV置位, 说明产生溢出(即大于127或小于-128)
不带进位的加法指令举例(二)
分析执行下列指令后,A和PSW中各标志的变化。
MOV A,#5AH ADD A,#6BH 90 A= 0 1 0 1 1 0 1 0 B + 107 data=0 1 1 0 1 0 1 1 B 197 0 11000101B
Cy=0 AC=1 OV=1 P=0
C7’ C6’
1)在乘法指令中对PSW的影响有Cy、OV、和P。 具体如下: Cy总是等于 0; P取决于A中“1”的个数; OV表明积的大小。当积超过255(B≠0)时,OV=1。
2)在除法指令中,Cy、P与乘法相同。在执行除法指 令时,若B=0时,OV=1,表示除数=0,除法无意义, 其余情况下OV被复位。
7、十进制调整: (DA
《单片机原理与应用技术》教学课件
加、减、乘、除这4种指令能对8位无
符号数进行直接运算 借助溢出标志也能对有符号数的二进 制整数进行加减运算。 借助进位标志,可以实现多字节的加、 减运算,也可对压缩BCD码进行运算
±1
Acc 累加器
ADD ADDC SUBB
@Ri 间接寻址
±1
Direct 直接寻址
分析执行下列指令后A和PSW中各标志的变化
CLR C MOV A, #52H
; #52H=01010010B = 82
SUBB A, #0B4H ; #0B4H=10110100B = - 76 a= 0 1 0 1 0 0 1 0 手工计算 82 – -76 data= 1 0 1 1 0 1 0 0 1 1 0 0 1 1 1 1 0 = 9E 158 1 0 1 【分析】:CPU的计算得-98,答案是错误的。 OV=1,产生了溢出。对于符号数的减法在运算 后一定要检测OV
第三节 MCS-51指令系统及应用举例
MCS-51指令集 功能分五类,共111条指令
《单片机原理与应用技术》教学课件
按指令的功能分类
数据传送类(29条)
算术运算类(24条) 逻辑运算及移位类(24) 位操作类(17条) 控制转移类(17条)
一、数据传送类指令(5种/29条)
内部存储器间传送: (MOV——16条) 外部数据存储器RAM与累加器间传送: (MOVX——4条) 程序存储器ROM向累加器传送: (MOVC——2条) 数据交换:(XCH,XCHD,SWAP——5条) 堆栈操作: (PUSH,POP——2条)
1)若两数是无符号数,Cy=0无溢出:90+107=197 2)若两数是有符号数,因OV=1,故有溢出,两个正 数相加后变为负数,很明显结果是不正确的。
2、带进位的加法指令
格式: ADDC A, Rn
ADDC A, direct ADDC A, @Ri ADDC A, #data
;A+Rn+Cy→A ;A+(direct) +Cy→A ;A+(Ri) +Cy→A ;A+data+Cy→A
使用减法指令要注意的几个问题
在MCS-51的指令系统中没有不带Cy的减法,
所以在使用SUBB指令前必须使用一条清除Cy 的指令:CLR C。
在进行减法运算中,CY=1表示有借位,CY=0
则无借位。
OV=1表明带符号数相减时,从一个正数减去
一个负数结果为负数,或者从一个负数中减 去一个正数结果为正数的错误情况。
MOV A,@R0
ADD A,@R1 ;被加数的十位、个位+加数的十
位、个位
DA A
;十进制调整
MOV @R0,A ;送结果
INC R0 INC R1
;R0指向被加数的千位、百位 ;R1指向加数的千位、百位 MOV A,@R0 ADDC A,@R1 ;被加数的千位、百位+加数的千位、百位 DA A ;十进制调整 MOV @R0,A ;送千位、百位的和 INC R1 INC R0 MOV A,@R0 ADDC A,@R1 DA A MOV @R0,A RET
41H 40H 31H 30H
X2 data8~15 X2 data0~7 X1 data8~15 X1 data0~7
5、减一指令
格式: DEC A
DEC Rn DEC direct DEC @Ri
;累加器A减一 ;Rn-1→Rn ;内存单元数据减一 ;内存单元数据减一
【注意】: 1)除了第一条对PSW的P有影响外,其余对PSW均 无影响。 2)由于上面的原因,DEC指令一般不作为数据算术 运算使用,它主要用于修改数据指针在控制、循环 语句中使用。
无符号数的乘除运算。用MUL和DIV指令实现A中 的二个BCD数的相乘,并再转换成二位BCD码放 于A中。
38H=3×16+8 分析: 假设(A)=38H 先将两个BCD码分离,如何分离? 除以16,即10H,商和余数即为两个BCD码 乘积之后,如何转为BCD码? 3*8=24
将16进制数除以10,即可得到两个BCD码
《单片机原理与应用技术》教学课件
二、算术运算类指令(6种/24条) P47
加法运算: 带进位加法运算: 带借位减法运算: 加1/减1操作: 单字节乘/除法运算: 十进制调整: (ADD——4条) (ADDC——4条) (SUBB——4条) (INC,DEC——9条) (MUL,DIV——2条) (DA A——1条)
8
6
0101 1000
1001 0001 0110 1001 0111
结果:A= 97H CY= 0
+
《单片机原理与应用技术》教学课件
书上部分例题:
例3-9:6位BCD码加法程序。设被加数放在32H、31H、 30H单元中,加数放在42H、41H、40H单元中,和放在 32H、31H、30H中。 BCD: MOV R0,#30H ;R0指向被加数的十位、个位, MOV R1,#40H ;R1指向加数的十位、个位,
三、逻辑运算及移位类指令
(5种/24条)
逻辑与运算:
逻辑或运算:
(ANL——6条)
(ORL——6条)
逻辑Fra Baidu bibliotek或运算:
(XRL——6条)
累加器清零/取反:(CLR,CPL——2条)
累加器移位操作: (RL,RLC,RR,RRC—4条)
38H=3×16+8
MULBCD:MOV B,#10H ;10H=16 DIV AB ;A中的BCD数除16分成两个BCD数, ;低字节在A中,高字节在B中。 MUL AB ;两个BCD数相乘,积在A中 ;十进制数0-99=0-63H (A)=18H(24) MOV B,#0AH DIV AB ;A中为十位数,B中为个位数 SWAP A ;A中的十位数置高4位中 ORL A,B ;A中高4位为积的十位数; ;低4位为个位数 RET
A——1条)
用于两个BCD码之间的相加,这条指令只能跟在 ADD 或 ADDC 之后,该指令影响CY标志位。
BCD码是指“用二进制表达的十进制数”。如: 十进制数20可以用二进制数00010100B表示; 也可以用十六进制数14H表示; 还可以用BCD码 00100000B 或 20H 表示。
4个二进制位就可以表示一位BCD码: 0000~1001 可表示十进制数(BCD数) 0~9; 8个二进制位就可以表示两位压缩的BCD码: 00000000~10011001 表示 00~99。