第3章 单片机原理及接口技术讲稿第三版李朝青.docx
《第3章 单片机原理及接口技术讲稿第三版李朝青.docx》由会员分享,可在线阅读,更多相关《第3章 单片机原理及接口技术讲稿第三版李朝青.docx(39页珍藏版)》请在冰豆网上搜索。
第3章单片机原理及接口技术讲稿第三版李朝青
第3章指令系统及程序设计举
§3.1汇编语言
§3.1.1指令和程序设计语言
指令:
是CPU根据人的意图来执行某种操作的命令。
程序设计语言:
是实现人机交换信息的基本工具,分为机器语言、汇编语言和高级语言。
机器语言:
用二进制编码表示每条指令,是计算机能直接识别和执行的语言。
汇编语言:
是用助记符、符号和数字等来表示指令的程序设计语言。
它与机器语言指令是一一对应的。
§3.1.2指令格式
89C51汇编语言指令格式
操作码[目的操作数][,源操作数][;注释]
汇编语言指令对应的二进制代码格式
单字节指令
1、指令码中隐含着对某一种寄存器的操作
如:
指令“INCDPTR”的指令代码格式为:
A3H=10100011
2、由指令中的rrr三位的不同编码指定某一寄存器
如:
指令“MOVA,Rn”的指令代码格式为:
11101rrr
双字节指令
用一个字节表示操作码,另一个字节表示操作数或操作数所在的地址。
格式为:
操作码立即数或地址
三字节指令
一个字节操作码,两个字节操作数。
格式为:
操作码立即数或地址立即数或地址
§3.2寻址方式
一、什么是寻址方式:
如何找到存放操作数的地址,把操作数提取出来的方法。
二、寻址方式的种类:
1、寄存器寻址
寄存器寻址:
由指令指出寄存器组R0~R7中的某一个或其他寄存器(A,B,DPTR等)的内容作为操作数。
例如:
MOVA,R0;(R0)→A
MOVP1,A;(A)→P1口
ADDA,R0;(A)+(R0)→A
2、直接寻址
直接寻址方式:
在指令中直接给出操作数所在存储单元的地址。
指令中操作数部分是操作数所在地址。
直接寻址方式可访问片内RAM的128个单元以及所有的SFR。
对于SFR,既可以使用它们的地址,也可以使用它们的名字。
例如:
MOVA,3AH;(3A)→A
MOVA,P1;(P1口)→A
或:
MOVA,90H;90H是P1口的地址
3、立即数寻址
立即数寻址:
指令操作码后面紧跟的是一字节或两字节操作数,用“#”号表示,以区别直接地址。
例如:
MOVA,3AH;(3AH)→A
MOVA,#3AH;3AH→A
MOVDPTR,#2000H;2000H→DPTR
;(DPH)=20H
;(DPL)=00H
4、寄存器间接寻址
寄存器间接寻址:
操作数的地址事先存放在某个寄存器中,寄存器间接寻址是把指定寄存器的内容作为地址,由该地址所指定的单元内容作为操作数。
89C51规定R0或R1为间接寻址寄存器,它可寻址内部地址RAM低位的128B单元内容。
还可采用DPTR作为间接寻址寄存器,寻址外部数据存储器的64KB空间。
例如:
将片内RAM65H单元内容47H送A,可执行指令“MOVA,@R0”。
其中R0内容为65H。
如图所示:
5、变址寻址(基址寄存器+变址寄存器间接寻址)
变址寻址:
以某个寄存器的内容为基地址,在这个基地址的基础上加上地址偏移量形成真正的操作数地址。
89C51中采用DPTR或PC为变址寄存器,A的内容为地址偏移量。
变址寻址只能访问程序存储器,访问范围为64KB。
例如:
MOVCA,@A+DPTR;((A)+(DPTR))→A
如图所示
6、相对寻址
相对寻址:
是以当前的PC值加上指令中规定的偏移量rel而形成实际的转移地址。
相对寻址只出现在相对转移指令中。
当前的PC值是指执行完相对指令后的PC值;相对转移指令操作码所在地址称为源地址;转移后的地址称为目的地址。
目的地址=源地址+相对转移指令字节数+rel
rel为补码表示的有符号数。
例如:
7、位寻址
位寻址:
采用位寻址方式的指令的操作数是8位二进制数中的某一位,指令中给出的是位地址。
位地址在指令中用bit表示。
例如:
CLRbit;
位地址的两种表示方法:
直接使用位地址,如D3H;直接用寄存器名字加位数,如PSW.3。
位寻址区域:
片内RAM的20H-2FH的16个单元中的128位;字节地址能被8整除的SFR。
三、寻址空间及符号注释
1、寻址空间:
见表3-2。
表3-2操作数寻址方式和有关空间
寻址方式
寻址空间
立即数寻址
程序存储器ROM
直接寻址
片内RAM低128B、特殊功能寄存器
寄存器寻址
工作寄存器R0-R7、A、B、C、DPTR
寄存器间接寻址
片内RAM低128B、片外RAM
变址寻址
程序存储器(@A+PC,@A+DPTR)
相对寻址
程序存储器256B范围(PC+偏移量)
位寻址
片内RAM的20H-2FH字节地址、部分SFR
2、符号注释:
Rn(n=0-7):
当前选中的工作寄存器组R0-R7。
Ri(I=0,1):
作为地址指针的两个工作寄存器R0,R1。
#data:
8位立即数。
#data16:
16位立即数。
direct:
8位片内RAM单元(包括SFR)的直接地址。
addr11:
11位目的地址,用于ACALL和AJMP指令中。
addr16:
16位目的地址。
用于LCALL和LJMP指令中。
rel:
补码表示的8位地址偏移量。
范围:
-128-+127D。
bit:
片内RAM或SFR的直接寻址位地址。
@:
间接寄存器的符号。
/:
位操作指令中对该位先取反再参与操作,不影响原值。
(×):
×中的内容。
((×)):
×指出的地址单元中的内容。
→:
指令操作流程方向。
§3.3MCS-51指令系统
概述:
MCS-51指令系统由111条指令组成。
单字节指令49条
双字节指令45条
三字节指令17条。
从指令执行时间看,
单周期指令64条
双周期45条
只有乘、除指令为4个周期。
MCS-51指令系统可分为五大类
[1]数据传送指令:
28条
[2]算术运算指令:
24条
[3]逻辑运算及移位指令:
25条
[4]控制转移指令:
17条
[5]位操作指令(布尔操作):
17条
§3.3.1数据传送指令
1.以累加器A为目的操作数的指令(4条,即4种寻址方式)
汇编指令格式
机器码格式
操作
注释
MOVA,Rn;
11101rrr
(Rn)→A
将工作寄存器Rn(即R0~R7)内容传送到累加器A中
MOVA,direct;
11100101
direct
(direct)→A
将直接寻址所得的片内RAM单元内容或特殊功能寄存器中的内容传送到累加器A中
MOVA,@Ri;
1110011i
((Ri))→A
将间接寻址(Ri为R0或R1)所得的片内RAM单元内容或特殊功能积存器中的内容传送到累加器A中
MOVA,#data;
01110100
data
#data→A
将立即数传送到累加器A中
例:
MOVA,#30H;(A)=30H
MOVA,30H;(A)=11H
MOVA,@R1;(A)=11H
MOVA,R1;(A)=30H
MOVA,#30H;(A)=30H
MOVA,30H;(A)=11H
MOVA,@R1;(A)=11H
MOVA,R1;(A)=30H
2、以寄存器Rn为目的操作数的指令(3条)
汇编指令格式
机器码格式
操作
注释
MOVRn,A;
11111rrr
A→Rn
将累加器A中内容传送到工作寄存器Rn(即R0-R7)中
MOVRn,direct;
10101rrr
direct
(direct)→Rn
将直接寻址所得片内RAM单元内容或特殊功能寄存器中内容传送到工作寄存器Rn(即R0-R7)中
MOVRn,#data;
01111rrr
data
#data→Rn
将立即数传送到工作寄存器Rn(即R0-R7)中
直接寻址和立这组指令的功能是把源操作数所指定的内容送到当前工作寄存器组R0~R7中的某个寄存器。
源操作数有寄存器寻址,即数寻址三种方式。
如:
(A)=78H,(R5)=47H,(70H)=F2H,执行指令:
MOVR5,A;(A)→R5,(R5)=78H
MOVR5,70H;(70H)→R5,(R5)=F2H
MOVR5,#A3H;A3H→R5,(R5)=A3H
注意,在89C51指令系统中没有“MOVRn,Rn”传送指令。
3、以直接地址为目的操作数的指令(5条)
汇编指令格式
机器码格式
操作
注释
MOVdirect,A;
11110101
direct
(A)→direct
将累加器A中内容传送到直接地址direct所指出的片内存储单元中。
MOVdirect,Rn;
1rrr
direct
(Rn)→direct
将工作寄存器Rn(即R0-R7)中内容传送到直接地址direct所指出的片内存储单元中
MOVdirect,direct;
10000101
源direct
目的direct
(源direct)→
目的direct
将直接地址源direct所指出的片内存储单元中内容传送到直接地址目的direct所指出的片内存储单元中
MOVdirect,@Ri;
1000011i
direct
((Ri))→direct
将间接寻址(Ri为R0或R1)所得的片内RAM单元内容传送到直接地址direct所指出的片内存储单元中
MOVdirect,#data;
01110101
direct
data
#data→direct
将立即数传送到直接地址direct所指出的片内存储单元中
这组指令的功能是把源操作数所指定的内容送入由直接地址direct所指出的片内存储单元中。
源操作数有寄存器寻址,直接寻址,寄存器间接寻址和立即寻址等方式。
4、以间接地址为目的操作数的指令(3条)
汇编指令格式
机器码格式
操作
注释
MOV@Ri,A;
1111011i
(A)→(Ri)
将累加器A中内容传送到间接寻址(Ri为R0或R1)所得的片内RAM单元中。
MOV@Ri,direct;
0101011i
direct
(direct)→(Ri)
将直接寻址所得的片内RAM单元内容或特殊功能寄存器中的内容传送到间接寻址(Ri为R0或R1)所得的片内RAM单元中
MOV@Ri,#data;
0111011I
data
#data→(Ri)
将立即数传送到间接寻址(Ri为R0或R1)所得的片内RAM单元中
(Ri)表示Ri中的内容为指定的RAM单元。
MOV指令在片内存储器的操作功能如图3-6示。
图3-6传送指令在片内存储器的操作功能
5、十六位数据传送指令(1条)
汇编指令格式
机器码格式
操作
注释
MOVDPTR,#data16;
0000
高位字节
低位字节
dataH→DPH
dataL→DPL
将高8位立即数dataH送入DPH,低8位立即数dataL送入DPL。
这条指令的功能是把16位常数送入DPTR。
DPTR由DPH和DPL组成。
例:
MOVDPTR#1000H;
(DPTR)=1000H,
(DPH)=10H,
(DPL)=00H
6、查表指令(2条)
汇编指令格式
机器码格式
操作
注释
MOVCA,@A+DPTR;
10010011
先(PC)+1→PC,
后((A)+(DPTR))→A
(远程查表)
MOVCA,@A+PC;
10000011
先(PC)+1→PC,
后((A)+(PC)→A
(近程查表)
上述两条指令的操作过程如图3-7所示。
图3-7程序存贮器传送(查表)
例:
若:
初始
ROM内容
2000H
00H
2001H
01H
2002H
09H
2003H
04H
2004H
06H
2005H
08H
2006H
FFH
2007H
66H
2008H
45H
2009H
ABH
200AH
11HH
执行下面程序段后结果如何?
MOVDPTR,#2000H;(DPTR)=2000H
MOVA,#0AH;(A)=0AH
MOVCA,@A+DPTR;(A)=((A)+(DPTR))=(200AH)
则:
(A)=(200AH)=11H
例:
若:
初始ROM内容为:
100FH
01H
1010H
02H
1011H
03H
1012H
04H
1000H
740D
MOV A,#0DH;
(A)=0DH
1002H
83
MOVCA,@A+PC;
(PC)=1002+1=1003H,
(A)=((A)+(PC))=(0D+1003)=(1010H)
(A)=02H
1003H
F8
MOVR0,A;
(R0)=(A)=02H
所以,最后结果为:
(A)=02(R0)=02(PC)=1004
7、累加器A与片外RAM传送指令(4条)
在8051指令系统中,CPU对片外RAM的访问只能用寄存器间接寻址的方式,且仅有四条指令:
汇编指令格式
机器码格式
操作
注释
MOVXA,@Ri;
1110001i
((Ri))→A
MOVXA,@DPTR;
11100000
((DPTR))→A
MOVX@Ri,A;
1111001i
(A)→(Ri)
MOVX@DPTR,A;
11110000
(A)→(DPTR)
第2,4两条指令以DPTR为片外数据存储器16位地址指针,寻址范围达64KB。
其功能是DPTR所指定的片外数据存储器与累加器A之间传送数据。
第1,3两条指令是用R0或R1作低8位地址指针,由P0口送出,寻址范围是256字节。
这两条指令完成以R0或R1为地址指针的片外数据存储器与累加器A之间的传送数据。
上述四条指令的操作如图3-8所示:
图3-8外部数据存储器传送操作
例:
若:
片内RAM(30H)=01H,片外RAM(30H)=02H,执行下面程序段后的结果如何。
MOVR1,#30H;(R1)=30H
MOVXA,@R1;(A)=02H
MOVR0,A;(R0)=(A)=02H
MOVA,@R1;(A)=((R1))=01H
MOVR2,A;(R2)=(A)=01H
8、栈操作指令(二条)
堆栈:
先进后出,后进先出。
汇编指令格式
机器码格式
操作
注释
PUSHdirect;
0000
direct
先(SP)+1→SP,
后(direct→(SP)
PUSH(入栈)指令
PUSHdirect;
0000
direct
先((SP))→direct,
后(SP)-1→SP
POP(出栈)指令
例:
MOVSP,#18H;(SP)=18H
MOVA,#30H;(A)=30H
MOVDPTR,#1000H;(DPTR)=1000H
PUSHA;(SP)=19H(19H)=30H
PUSHDPH;(SP)=1AH(1AH)=10H
PUSHDPL;(SP)=1BH(1BH)=00H
继续上例:
POPDPL;(DPL)=00H(SP)=1AH
POPDPH;(DPH)=10H(SP)=19H
POPA;(A)=30H(SP)=18H
9、交换指令(4条)
(1)字节变换指令
汇编指令格式
机器码格式
操作
注释
XCHA,Rn;
11001rrr
(A)←→(Rn)
XCHA,direct;
0101direct
(A)←→(direct)
XCHA,@Ri;
1100011i
(A)←→((Ri))
将第二操作数所指定的工作寄存器Rn(R0~R7),直接寻址和间接寻址的单元内容与累加器A中内容互换。
其操作可表示为:
A一字节源操作数一字节
例:
初始时:
(A)=34H,(30H)=11H
XCHA,30H;(A)=11H,(30H)=34H
MOVR1,#30H;(R1)=30H
XCHA,@R1;(A)=34H,(30H)=11H
(2)半字节交换指令
汇编指令格式
机器码格式
操作
注释
XCHDA,@Ri;
1101011i
(A0~3)←→((Ri)0~3)
这条指令为低半字节交换指令。
该指令将累加器A的低4位与R0或R1所指出的片内RAM单元的低4位数据相互交换,各自的高4位不变,其操作表示为:
继续上例:
XCHDA,@R1;(A)=31H;(30H)=14H
§3.3.2算术运算指令
1、不带进位加法指令(四条)
汇编指令格式
机器码格式
操作
注释
ADDA,Rn;
00101rrr
(A)+(Rn)→A
将工作寄存器内容和累加器A中的数相加,“和”存放于累加器A中
ADDA,direct;
00100101
direct
(A)+(direct)→A
将内部RAM单元内容和累加器A中的数相加,“和”存放于累加器A中
ADDA,@Ri;
0010011i
(A)+((Ri))→A
将间接寻址(Ri为R0或R1)所得的片内RAM单元中内容和累加器A中的数相加,“和”存放于累加器A中
ADDA,#data;
00100100
data
(A)+#data→A
将立即数的8位无符号二进制数和累加器A中的数相加,“和”存放于累加器A中
上述指令的执行将影响标志位AC,Cy,OV,P。
当“和”的第3位或第7位有进位时,分别将AC,CY标志位置1,否则为0。
溢出标志位OV=C7C6(异或),该标志位只有带符号数运算时才有用。
例:
若:
(A)=78H,(R0)=64H
执行ADDA,R0后,结果及PSW=?
(A):
78H=01111000B
+(R0):
64H=01100100B
(A):
DCH=11011100B
标志位:
CY=0,AC=0,OV=1,P=1,即PSW=05H
结果:
(A)=DCH(R0)=64H
2、带进位加法指令(四条)
汇编指令格式
机器码格式
操作
注释
ADDCA,Rn;
00111rrr
(A)+CY+(Rn)→A
将工作寄存器内容、CY位和累加器A中的数相加,“和”存放于累加器A中
ADDCA,direct;
00110101
direct
(A)+(direct)+CY→A
将内部RAM单元内容、CY位和累加器A中的数相加,“和”存放于累加器A中
ADDCA,@Ri;
0011011i
(A)+((Ri))+CY→A
将间接寻址(Ri为R0或R1)所得的片内RAM单元中内容、CY位和累加器A中的数相加,“和”存放于累加器A中
ADDCA,#data;
00110100
data
(A)+#data+CY→A
将立即数的8位无符号二进制数、CY位和累加器A中的数相加,“和”存放于累加器A中
本组指令的功能是同时把源操作数所指出的内容和进位标志未CY都加到累加器A中,结果存放到A中,其余的功能和上面的ADD指令相同。
本组指令常用于多字节加法。
例:
设(A)=0C3H,(R0)=0AAH,(CY)=1。
执行指令“ADDCA,R0”后的结果及标志位如何?
解:
(A):
C3H=11000011
+(CY):
1=00000001
11000100
+(R0):
AAH=10101010
(A):
6EH=01101110
标志位:
CY=1,OV=1,AC=0,
结果:
(A)=6EH,(R0)=0AAH。
例:
编程,将(30H),(31H)单元中的数与(40H),(41H)单元中的数相加,结果存于(30H),(31H)单元中。
解:
MOVA,30H
ADDA,40H
MOV30H,A
MOVA,31H
ADDCA,41H
MOV31H,A
3、带借位减法指令(四条)
汇编指令格式
机器码格式
操作
注释
SUBBA,Rn;
10011rrr
(A)-CY-(Rn)→A
将累加器A中的数减去CY位及工作寄存器内容“差”存放于累加器A中
SUBBA,direct;
10010101
direct
(A)-CY-(direct)→A
将累加器A中的数减去CY位及内部RAM单元内容“差”存放于累加器A中
SUBBA,@Ri;
1001011i
(A)-CY-((Ri))→A
将累加器A中的数减去CY位及间接寻址(Ri为R0或R1)所得的片内RAM单元中内容,“差”存放于累加器A中
SUBBA,#data;
10010100
data
(A)-CY-#data→A
将累加器A中的数减去CY位及立即数的8位无符号二进制数,“差”存放于累加器A中
这组指令的功能是从累加器A中减去源操作数所指出的数及进位位CY的值,差保留在累加器A中。
由于89C51指令系统中没有不带借位的减法指令,如需要的话,可以在“SUBB”指令前用“CLRC”指令将Cy清0,这一点必须注意。
例:
设(A)=0C9H,(R2)=54H,Cy=1。
执行指令“SUBBA,R2”的结果如何?
解:
(A)=0C9H=11001001B
-)Cy=1=00000001B
11001000B
-)(R2)=54H=01010100B
(A)=74H=01110100B
结果为:
(A)=74H
标志位为:
Cy=0AC=0OV=1P=0
4、乘法指令(1条)
汇编指令格式
机器码格式
操作
注释
MULAB;
10100100
(A)×(B)→B15-8
A7-0
将累加器A和寄存器B中两个无符号数相乘,所得16位积的低字节存放在A中,高字节存放中B中。
该指令若乘积大于0FFH,则OV置1,否则OV清0。
Cy位总是被清0。
例:
(A)=4EH,(B)=5DH,
执行指令“MULAB”后结果如何?
解:
结果为:
(B)=1CH,
(A)=56H,
表示积(BA)=1C56H,OV=1。
5、除法指令(1条)
汇编指令格式
机器码格式
操作
注释
DIVAB;
10000100
(A)/(B)的商→A