AT89C51单片机指令系统.docx
《AT89C51单片机指令系统.docx》由会员分享,可在线阅读,更多相关《AT89C51单片机指令系统.docx(29页珍藏版)》请在冰点文库上搜索。
AT89C51单片机指令系统
第3章AT89C51单片机指令系统
难点
∙MCS-51单片机的寻址方式
∙数据传送指令和算术运算指令的使用
∙位操作和控制转移类指令的使用
要求
掌握:
∙MCS-51单片机的寻址方式
∙指令系统的基本格式
∙指令系统的操作功能
了解:
∙指令系统的基本格式
∙操作数的使用方法
∙指令系统的操作过程
3.1MCS-51单片机指令格式
3.2寻址方式
3.3指令系统
3.1MCS-51单片机指令格式
计算机的指令系统是表征计算机性能的重要指标,每种计算机都有自己的指令系统。
MCS—51单片机的指令系统是一个具有255种代码的集合,绝大多数指令包含两个基本部分:
操作码和操作数。
操作码表明指令要执行的操作的性质;操作数说明参与操作的数据或数据所存放的地址。
MCS—51指令系统中所有程序指令是以机器语言形式表示,可分为单字节、双字节、三字节3种格式。
用二进制编码表示的机器语言由于阅读困难,且难以记忆。
因此在微机控制系统中采用汇编语言指令来编写程序。
本章介绍MCS—51指令系统就是以汇编语言来描述的。
表3-1汇编指令与指令代码
代码字节
指令代码
汇编指令
指令周期
单字节
84
DIVAB
四周期
单字节
A3
INCDPTR
双周期
双字节
7410
MOVA,#10H
单周期
三字节
B440rel
CJNEA,#40H,LOOP
双周期
一条汇编语言指令中最多包含4个区段,如下所示:
标号:
操作码目的操作数,源源操作数;注释
标号与操作码之间“:
”隔开;
操作码与操作数之间用“空格”隔开;
目的操作数和源源操作数之间有“,”分隔;
操作数与注释之间用“;”隔开。
标号是由用户定义的符号组成,必须用英文大写字母开始。
标号可有可无,若一条指令中有标号,标号代表该指令所存放的第一个字节存储单元的地址,故标号又称为符号地址,在汇编时,把该地址赋值给标号。
操作码是指令的功能部分,不能缺省。
MCS—51指令系统中共有42种助记符,代表了33种不同的功能。
例如MOV是数据传送的助记符。
操作数是指令要操作的数据信息。
根据指令的不同功能,操作数的个数有3、2、1或没有操作数。
例如MOV A,#20H,包含了两个操作数A和#20H,它们之间用“,”隔开。
注释可有可无,加入注释主要为了便于阅读,程序设计者对指令或程序段作简要的功能说明,在阅读程序或调试程序时将会带来很多方便。
3.2寻址方式
所谓寻址方式,通常是指某一个CPU指令系统中规定的寻找操作数所在地址的方式,或者说通过什么的方式找到操作数。
寻址方式的方便与快捷是衡量CPU性能的一个重要方面,MCS—51单片机有七种寻找方式。
3.2.1立即数寻址
立即寻址方式是操作数包括在指令字节中,指令操作码后面字节的内容就是操作数本身,其数值由程序员在编制程序时指定,以指令字节的形式存放在程序存储器中。
立即数只能作为源操作数,不能当作目的操作数。
例如:
MOVA,#52H;A52H
MOVDPTR,#5678H;DPTR5678H
立即寻址示意图如3.1所示。
图3.1立即寻址示意图
3.2.2 直接寻址
在指令中含有操作数的直接地址,该地址指出了参与操作的数据所在的字节地址或位地址。
例如:
MOVA,52H;把片内RAM字节地址52H单元的内容送累加器A中。
MOV52H,A;把A的内容传送给片内RAM的52H单元中。
MOV50H,60H;把片内RAM字节地址60H单元的内容送到50H单元中。
MOV IE,#40H;把立即数40H送到中断允许寄存器IE。
IE为专用功能寄存器,其字节地
址为0A8H。
该指令等价于MOV0A8H,#40H。
INC 60H ;将地址60H单元中的内容自加1。
图3.2直接寻址方式示意图
在MCS-51单片机指令系统中,直接寻址方式可以访问2种存储空间:
(1)内部数据存储器的低128个字节单元(00H~7FH)
(2)80H~FFH中的(SFR)特殊功能寄存器。
这里要注意,指令MOVA,#52H与MOVA,52H指令的区别,后者表示把片内RAM字节地址为52H单元的内容传送到累加器(A)。
3.2.3 寄存器寻址
由指令指出某一个寄存器中的内容作为操作数,这种寻址方式称为寄存器寻址。
寄存器一般指累加器A和工作寄存器R0~R7。
例如:
MOVA,Rn;A(Rn)其中n为0~7之一,Rn是工作寄存器。
MOVRn,A;Rn(A)
MOVB,A;B(A)
寄存器寻址方式的寻址范围包括:
· 寄存器寻址的主要对象是通用寄存器,共有4组32个通用寄存器,但寄存器寻址只能使用当前寄存器组。
因此指令中的寄存器名称只能是R0~R7。
在使用本指令前,需通过对PSW中RS1、RS0位的状态设置,来进行当前寄存器组的选择。
· 部分专用寄存器。
累加器A、B寄存器以及数据指针DPTR等。
3.2.4 寄存器间接寻址方式
由指令指出某一个寄存器的内容作为操作数,这种寻址方式称为寄存器间接寻址。
这里要注意,在寄存器间接寻址方式中,存放在寄存器中的内容不是操作数,而是操作数所在的存储器单元地址。
寄存器间接寻址只能使用寄存器Ro或Rl作为地址指针,来寻址内部RAM(00H~FFH)中的数据。
寄存器间接寻址也适用于访问外部RAM,可使用R0,Rl或DPTR作为地址指针。
寄存器间接寻址用符号“@”表示。
例如:
MOVR0,#60H;R060H
MOVA,@R0;A((R0))
MOVA,@R1;A((R1))
指令功能是把Ro或R1所指出的内部RAM地址60H单元中的内容送累加器A。
假定(60H)=3BH,则指令的功能是将3BH这个数送到累加器A。
例如,MOVDPTR,#3456H;DPTR3456H
MOVXA,@DPTR;A((DPTR))
是把DPTR寄存器所指的那个外部数据存储器(RAM)的内容传送给A,假设(3456H)=99H,指令运行后(A)=99H。
同样,MOVX@DPTR,A;MOV@R1,A;也都是寄存器间接寻址方式。
寄存器间接寻址方式的示意图如图3.3所示。
图3.3寄存器间接寻址方式示意图
3.2.5 位寻址
MCS-51单片机中设有独立的位处理器。
位操作指令能对内部RAM中的位寻址区(20H~2FH)和某些有位地址的特殊功能寄存器进行位操作。
也就是说可对位地址空间的每个位进行位状态传送、状态控制、逻辑运算操作。
例如指令
SETBTR0;TR01
CLR00H;(00H)0
MOVC,57H;将57H位地址的内容传送到位累加器C中
ANLC,5FH;将5FH位状态与进位位C相与,结果在C中
3.2.6 基址寄存器加变址寄存器间接寻址
这种寻址方式用于访问程序存储器中的数据表格,它以基址寄存器(DPTR或PC)的内容为基本地址,加上变址寄存器A的内容形成16位的地址,访问程序存储器中的数据表格。
例如;
MOVCA,@A+DPTR
MOVCA,@A+PC
JMP@A+DPTR
MOVCA,@A+DPTR
图3.4变址寻址方式示意图
3.2.7 相对寻址
相对寻址以程序计数器PC的当前值作为基地址,与指令中给出的相对偏移量rel进行相加,把所得之和作为程序的转移地址。
这种寻址方式用于相对转移指令中,指令中的相对偏移量是一个8位带符号数,用补码表示。
可正可负,转移的范围为-128~+127。
使用中应注意rel的范围不要超出。
例如:
JZLOOP
DJNER0,DISPLAY
3.3指令系统
3.3.1指令分类
MCS-51指令系统有42种助记符,代表了33种功能,指令助记符与各种可能的寻址方式相结合,共构成111条指令。
在这些指令中,单字节指令有49条,双字节指令有45条,三字节指令有17条;从指令执行的时间来看,单周期指令有64条,双周期指令有45条,只有乘法、除法两条指令的执行时间是4个机器周期。
按指令的功能,MCS-51指令系统可分为下列5类:
(1)数据传送类指令(29条)
(2)算术运算类指令(24条)
(3)逻辑运算及移位类指令(24条)
(4)位操作类指令(17条)
(5)控制转移类指令(17条)
在分类介绍指令前,先把描述指令的一些符号的意义作一简单介绍。
Rn―当前选定的寄存器区中的8个工作寄存器R0~R7,即n=0~7。
Ri―当前选定的寄存器区中的2个寄存器R0、R1,i=0、1。
Direct—8位内部RAM单元的地址,它可以是一个内部数据区RAM单元(00H~7FH)或特殊功能寄存器地址(I/O端口、控制寄存器、状态寄存器80H~0FFH)。
#data—指令中的8位常数。
#data16—指令中的16位常数。
addr16—16位的目的地址,用于LJMP、LCALL,可指向64KB程序存储器的地址空间。
addr11—11位的目的地址,用于AJMP、ACALL指令。
目的地址必须与下一条指令的第一个字节在同一个2KB程序存储器地址空间之内。
rel—8位带符号的偏移量字节,用于SJMP和所有条件转移指令中。
偏移量相对于下一条指令的第一个字节计算,在—128~+127范围内取值。
bit—内部数据RAM或特殊功能寄存器中的可直接寻址位。
DPTR—数据指针,可用作16位的地址寄存器。
A—累加器
B—寄存器,用于MUL和DIV指令中。
C—进位标志或进位位。
@—间接寄存器或基址寄存器的前缀,如@Ri,@DPTR。
/—位操作的前缀,表示对该位取反。
(X)—X中的内容。
((X))—由X寻址的单元中的内容。
←—箭头左边的内容被箭头右边的内容所替代。
3.3.2数据传送类指令
数据传送类指令一般的操作是把源操作数传送到指令所指定的目标地址。
指令执行后,源操作数保持不变,目的操作数为原操作数所替代
数据传送类指令用到的助记符有:
MOV,MOVX,MOVC,XCH,XCHD,PUSH,POP,SWAP。
数据一般传送指令的助记符“MOV”表示
格式:
MOV[目的操作数],[源操作数]
功能:
目的操作数(源操作数中的数据)
源操作数可以是:
A、Rn、direct、@Ri、#data
目的操作数可以是:
A、Rn、direct、@Ri
数据传送指令一般不影响标志,只有一种堆栈操作可以直接修改程序状态字PSW,这样,可能使某些标志位发生变化。
1.以累加器为目的操作数的内部数据传送指令
MOV
A,Rn
;A(Rn)
MOV
A,direct
;A(direct)
MOV
A,@Ri
;A((Ri))
MOV
A,#data
;Adata
这组指令的功能是:
把源操作数的内容送入累加器A。
例如:
MOVA,#10H,该指令执行时,将立即数10H(在ROM中紧跟在操作码后)送入累加器A中。
2.数据传送到工作寄存器Rn的指令
MOV
Rn,A
;Rn(A)
MOV
Rn,direct
;Rn(direct)
MOV
Rn,#data
;Rndata
这组指令的功能是:
把源操作数的内容送入当前工作寄存器区的R0~R7中的某一个寄存器。
指令中Rn在内部数据存储器中的地址由当前的工作寄存器区选择位RS1、RS0确定,可以是00H~07H、08H~0FH、10H~17H、18H~1FH。
例如:
MOVR0,A,若当前RS1、RS0设置为00(即工作寄存器0区),执行该指令时,将累加器A中的数据传送至工作寄存器R0(内部RAM00H)单元中。
3.数据传送到内部RAM单元或特殊功能寄存器SFR的指令
MOV
direct,A
;direct(A)
MOV
direct,Rn
;direct(Rn)
MOV
direct1,direct2
;direct1(direct2)
MOV
direct,@Ri
;direct((Ri))
MOV
direct,#data
;direct#data
MOV
@Ri,A
;(Ri(A)
MOV
@Ri,direct
;(Ri)(direct)
MOV
@Ri,#data
;(Ri)data
MOV
DPTR,#data16
;DPTRdata16
这组指令的功能是:
把源操作数的内容送入内部RAM单元或特殊功能寄存器。
其中第三条指令和最后一条指令都是三字节指令。
第三条指令的功能很强,能实现内部RAM之间、特殊功能寄存器之间或特殊功能寄存器与内部RAM之间的直接数据传送。
最后一条指令是将16位的立即数送入数据指针寄存器DPTR中。
片内数据RAM及寄存器的数据传送指令MOV、PUSH和POP共18条,如图3.5所示。
图3.5片内RAM及寄存器的数据传送指令
4.累加器A与外部数据存储器之间的传送指令
MOVX
A,@DPTR
;A(DPTR)
MOVX
A,@Ri
;A((Ri))
MOVX
@DPTR,A
;(DPTR)A
MOVX
@Ri,A
;(Ri)A
这组指令是:
在累加器A与外部数据存储器RAM单元或I/O口之间进行数据传送前两条指令执行时,P3.7引脚上输出
有效信号,用作外部数据存储器的读选通信号;后两条指令执行时,P3.6引脚上输出
有效信号,用作外部数据存储器的写选通信号。
DPTR所包含的16位地址信息由P0(低8位)和P2(高8位)输出,而数据信息由P0口传送,P0口作分时复用的总线。
由Ri作为间接寻址寄存器时,P0口上分时Ri指定的8位地址信息及传送8位数据,指令的寻址范围只限于外部RAM的低256个单元。
片外数据存储器数据传送指令MOVX共4条,如图3.6所示。
图3.6片外数据存储器数据传送指令
5.程序存储器内容送累加器
MOVCA,@A+PC
MOVCA,@A+DPTR
这是两条很有用的查表指令,可用来查找存放在外部程序存储器中的常数表格。
第一条指令是以PC作为基址寄存器,A的内容作为无符号数和PC的内容(下一条指令的起始地址)相加后得到一个16位的地址,并将该地址指出的程序存储器单元的内容送到累加器A。
这条指令的优点是不改变特殊功能寄存器PC的状态,只要根据A的内容就可以取出表格中的常数。
缺点是表格只能放在该条指令后面的256个单元之中,表格的大小受到了限制,而且表格只能被一段程序所利用。
第二条指令是以DPTR作为基址寄存器,累加器A的内容作为无符号数与DPTR内容相加,得到一个16位的地址,并把该地址指出的程序存储器单元的内容送到累加器A。
这条指令的执行结果只与指针DPTR及累加器A的内容有关,与该指令存放的地址无关,因此,表格的大小和位置可以在64KB程序存储器中任意安排,并且一个表格可以为各个程序块所公用。
程序存储器查表指令MOVC共2条,如图3.7所示。
图3.7片外数据存储器数据传送指令
6.堆栈操作指令
PUSHdirect
POPdirect
在MCS-51单片机的内部RAM中,可以设定一个先进后出、后进先出的区域,称其为堆栈。
在特殊功能寄存器中有一个堆栈指针SP,它指出栈顶的位置。
进栈指令的功能是:
首先将堆栈指针SP的内容加1,然后将直接地址所指出的内容送入SP所指出的内部RAM单元;出栈指令的功能是:
将SP所指出的内部RAM单元的内容送入由直接地址所指出的字节单元,接着将SP的内容减1。
例如:
进入中断服务程序时,把程序状态寄存器PSW、累加器A、数据指针DPTR进栈保护。
设当前SP为60H。
则程序段
PUSHPSW
PUSHACC
PUSHDPL
PUSHDPH
执行后,SP内容修改为64H,而61H、62H、63H、64H单元中依次栈入PSW、A、DPL、DPH的内容,当中断服务程序结束之前,如下程序段(SP保持64H不变)
POPDPH
POPDPL
POPACC
POPPSW
指令执行之后,SP内容修改为60H,而64H、63H、62、61H单元的内容依次弹出到DPH、DPL、A、PSW中。
MCS-51提供一个向上的堆栈,因此SP设置初值时,要充分考虑堆栈的深度,要留出适当的单元空间,满足堆栈的使用。
7.字节交换指令
数据交换主要是在内部RAM单元与累加器A之间进行,有整字节和半字节两种交换。
(1) 整字节交换指令
XCH
A,Rn
;(A)(Rn)
XCH
A,direct
;(A)(direct)
XCH
A,@Ri
;(A)((Ri))
(2)半字节交换指令
字节单元与累加器A进行低4位的半字节数据交换。
只有一条指令。
XCHDA,@Ri
(3)累加器高低半字节交换指令
只有一条指令:
SWAPA
【例3-1】(R0)=30H,(A)=65H,(30H)=8FH
执行指令:
XCH A,@R0;(R0)=30H,(A)=8FH,(30H)=65H
XCHD A,@R0;(R0)=30H,(A)=6FH,(30H)=85H
SWAP A;(A)=56H
数据交换指令XCH、XCHD、和SWAP共5条,如图3.8所示。
图3.8数据交换指令
3.3.3算术运算类指令
算术运算类指令共有24条,包括加、减、乘、除4种基本算术运算指令,这4种指令能对8位的无符号数进行直接运算,借助溢出标志,可对带符号数进行补码运算;借助进位标志,可实现多精度的加、减运算,同时还可对压缩的BCD码进行运算,其运算功能较强。
算术指令用到的助记符共有8种:
ADD、ADDC、INC、SUBB、DEC、DA、MUL、DIV。
算术运算指令执行结果将影响进位标志(Cy),辅助进位标志(Ac)、溢出标志位(Ov)。
但是加1和减1指令不影响这些标志。
对标志位有影响的算术运算指令见表3-10中,×表示指令运算的结果使该标志位置位或复位。
1.加法指令
加法指令分为普通加法指令、带进位加法指令和加1指令。
(1)普通加法指令
ADD
A,Rn
;A(A)+(Rn)
ADD
A,direct
;A(A)+(direct)
ADD
A,@Ri
;A(A)+((Ri))
ADD
A,#data
;A(A)+data
这组指令的功能是将累加器A的内容与第二操作数相加,其结果放在累加器A中。
相加过程中如果位7(D7)有进位,则进位标志Cy置“1”,否则清“0”;如果位3(D3)位有进位,则辅助进位标志Ac置“1”,否则清“0”。
对于无符号数相加,若Cy置“1”,说明和数溢出(大于255)。
对于带符号数相加时,和数是否溢出(大于+127或小于-128),则可通过溢出标志OV来判断,若OV置为“1”,说明和数溢出。
【例3-2】(A)=85H,R0=20H,(20H)=0AFH,执行指令:
ADDA,@R0
结果:
(A)=34H;Cy=1;AC=1;OV=1。
对于加法,溢出只能发生在两个加数符号相同的情况。
在进行带符号数的加法运算时,溢出标志OV是一个重要的编程标志,利用它可以判断两个带符号数相加,和数是否溢出。
(2)带进位加法指令
ADDC
A,Rn
;A(A)+(Rn)+(Cy)
ADDC
A,direct
;A(A)+(direct)+(Cy)
ADDC
A,@Ri
;A(A)+((Ri))+(Cy)
ADDC
A,#data
;A(A)+data+(Cy)
这组指令的功能与普通加法指令类似,唯一的不同之处是,在执行加法时,还要将上一次进位标志Cy的内容也一起加进去,对于标志位的影响也与普通加法指令相同。
【例3-3】(A)=85H,(20H)=0FFH,Cy=1执行指令:
ADDCA,20H
结果:
(A)=85H;Cy=1;AC=1;OV=0。
(3)增量指令
INC
A
;A(A)+1
INC
Rn
;Rn(Rn)+1
INC
direct
;direct(direct)+1
INC
@Ri
;(Ri)((Ri))+1
INC
DPTR
;DPTR(DPTR)+1
这组指令的功能是:
将指令中指出的操作数的内容加1。
若原来的内容为0FFH,则加1后将产生溢出,使操作数的内容变成00H,但不影响任何标志。
最后一条指令是对16位的数据指针寄存器DPTR执行加1操作,指令执行时,先对低8位指针DPL的内容加1,当产生溢出时就对高8位指针DPH加1,但不影响任何标志。
【例3-4】(A)=12H,(R3)=0FH,(35H)=4AH,(R0)=56H,(56H)=00H
执行如下指令:
INC A ;执行后(A)=13H
INC R3 ;执行后(R3)=10H
INC 35H ;执行后(35H)=4BH
INC @R0 ;执行后(56H)=01H
(4)十进制调整指令
DAA
这条指令对累加器A参与的BCD码加法运算所获得的8位结果进行十进制调整,使累加器A中的内容调整为二位压缩型BCD码的数。
使用时必须注意,它只能跟在加法指令之后,不能对减法指令的结果进行调整,且其结果不影响溢出标志位。
执行该指令时,判断A中的低4位是否大于9,若满足大于则低4位做加6操作;
同样,A中的高4位大于9则高4位加6操作。
例如:
有两个BCD数36与45相加,结果应为BCD码81,程序如下:
MOVA,#36H
ADDA,#45H
DAA
这段程序中,第一条指令将立即数36H(BCD码36H)送入累加器A;第二条指令进行如下加法:
得结果7BH;第三条指令对累加器A进行十进制调整,低4位(为0BH)大于9,因此要加6,最后得到调整的BCD码81。
2.减法指令
(1)带进位减法指令
SUBB
A,Rn
;A(A)-(Rn)-(Cy)
SUBB
A,direct
;A(A)-(direct)-(Cy)
SUBB
A,@Ri
;A(A)-(Ri)-(Cy)
SUBB
A,#data