资料简介
§3.1 概述
7种寻址方式,111条指令
字节数
运算速度
单字节指令:49条
双字节指令:45条
三字节指令:17条
单周期指令:64条
双周期指令:45条
四周期指令: 2 条
第三章 MCS-51指令系统
Instruction Set功能
数据传送类:29条
算术运算类:24条
逻辑运算类:24条
控制转移类:17条
位操作类: 17条常用符号
Rn:工作寄存器中的寄存器R0、R1…R7之一,
Ri:工作寄存器中的寄存器R0或R1
#data:8位立即数
#data16:16位立即数
direct:片内RAM或SFR的地址(8位)
@间接寻址寄存器
Bit:片内RAM或SFR的位地址
addr11:11位目的地址
addr16:16位目的地址rel: 补码形式的8位地址偏移量。
偏移范围为-128~127
/:位操作指令中,该位求反后参与操作,不影响
该位
X:片内RAM的直接地址或寄存器
(X):相应地址单元中的内容
→:箭头左边的内容送入箭头右边的单元内 §3.2 寻址方式
3.2.1 立即寻址
Immediate Addressing
操作数就包含在指令代码中,在操作码之后,称为
立即数,用“#”表示。
MCS-51
如:MOV P1, #80H
MOV R7, #0F5H
MOV DPTR,#1245H
操作数存在程
序存储器中 3.2.2 直接寻址
Direct Addressing
直接使用数所在单元的地址找到了操作数,所以称
这种方法为直接寻址。
操作数在SFR、内部RAM、位地址空间。
如: MOV A,00H
MOV C,60H
MOV A,0F0H3.2.3 寄存器寻址
Register Addressing
对选定的工作寄存器R0~R7、累加器A、通用寄存器B、
地址寄存器DPTR中的数进行操作。
例:MOV A,R0;将R0工作寄存器中的数据送到累加器A中去。
提一个问题:我们知道,工作寄存器就是内存单元
的一部分,如果我们选择工作寄存器组0,则R0就
是RAM的00H单元,那么这样一来,MOV A,00H
和 MOV A,R0不就没什么区别了吗? 的确,这两条指令执行的结果是完全相同的,
都是将00H单元中的内容送到A中去,但是执行的过
程不同,执行第一条指令需要2个机器周期,而第二
条则只需要1个机器周期,第一条指令变成最终的目
标码要两个字节(E5H 00H),而第二条则只要一个
字节(E8H)就可以了。3.2.4 寄存器间接寻址
Register Indirect Addressing
把地址放在另外一个寄存器中,根据这个寄存器中的数值
决定该到哪个单元中取数据。
.R0,R1----8位地址,片内低128字节或片外
.DPTR----16位,片外64KB
MCS-51
如: MOV A,@R0
MOVX A,@R0
MOVX A,@DPTR
操作数在
片内RAM中
操作数在
片外RAM中
操作数在
片外RAM中以DPTR或PC为基址寄存器,累加器A为变址寄存器。把两
者内容相加,结果作为操作数的地址。
常用于查表操作。
MCS-51
MOVC A, @A+DPTR ;(A+DPTR) →A
MOVC A, @A+PC ; PC+1 →PC,(A+PC)→A
3.2.5 变址寻址(基址+变址)
Base-Register-plus-Index-Register-Indirect Addressing
操作数在程
序存储器中E0
A程序存储区
2040H 93
20E0H 47
2041H …
… …
DPH 20
DPL 00
ALU
如:MOVC A,@A+DPTR
设DPTR=2000H,A=E0H
20E0H
47
指令代码3.2.6 相对寻址
将PC中的当前内容与指令第二字节给出的数相加,结
果作为跳转指令的转移地址(转移目的地址)。
PC中的当前内容称为基地址(本指令后的字节地址)
指令第二字节给出的数据称为偏移量,1字节带符号数.
常用于跳转指令。
如: JC 23H
若C=0,不跳转; C=1,跳转.
Relative Addressing改变PC程序存储区
ALU
如:JC 23
1025H
1000H 40
1025H 45
1001H 23
… …
1024H 47
1002H 30
23H 1002H
指令代码
当前PC 对片内RAM的位寻址区和某些可位寻址的特殊功
能寄存器进行位操作时的寻址方式。
如: SETB 3DH; 将27H.5位置1
CLR C ;Cy位清0
3.2.7 位寻址
Bit Addressing
操作数在片内
RAM位地址区或
SFR某些位中寻址方式涉及的存储器空间
寻址方式寻址方式 寻址空间(操作数存放空间)寻址空间(操作数存放空间)
立即寻址立即寻址 程序存储器程序存储器
直接寻址直接寻址 片内片内RAMRAM低低128128字节、字节、SFRSFR
寄存器寻址寄存器寻址 工作寄存器工作寄存器R0R0~~R7,A,B,DPTRR7,A,B,DPTR
寄存器间接寻址寄存器间接寻址 片内片内RAM:@R0,@R1,SPRAM:@R0,@R1,SP
片外片外RAM:@R0 ,@R1,@DPTRRAM:@R0 ,@R1,@DPTR
变址寻址变址寻址 程序存储器程序存储器:@A+PC,@A+DPTR:@A+PC,@A+DPTR
相对寻址相对寻址 程序存储器程序存储器256256字节范围内字节范围内:PC+:PC+偏移量偏移量
位寻址位寻址 片内片内RAMRAM的位寻址区的位寻址区(20H(20H~~2FH2FH字节地址字节地址))
某些可位寻址的某些可位寻址的SFRSFR§3.3 数据传送类指令(29条)
Data Transfer Instruction
MCS-51 助记符:
助记符:
MOV、MOVX、MOVC
XCH、XCHD、SWAP
PUSH、POP
源操作数寻址方式(5种):
立即寻址、直接寻址、寄存器寻址、
寄存器间接寻址、变址寻址。
目的操作数寻址方式(3种):
直接寻址、寄存器寻址、寄存器间接寻址
除了目的操作数为ACC的指令影响奇偶标志P外,一般不影响
标志位。3.3.1 十六位数的传递指令(1条)
MOV DPTR,#data16
8051是一种8位机,这是唯一的一条16位立即数传递指
令。功能:将一个16位的立即数送入DPTR中去。其中
高8位送入DPH,低8位送入DPL。
例:MOV DPTR,#1234H
执行完了之后DPH中的值为12H,DPL中的值为34H。
如果我们分别向DPH,DPL送数,则结果也一样。
如下面两条指令: MOV DPH,#35H
MOV DPL,#12H。
则就相当于执行了 MOV DPTR,#3512H。3.3.2 累加器A与片外RAM之间的数据传递类指令(4条
)
MOVX A,@Ri
MOVX @Ri,A
MOVX A,@DPTR
MOVX @DPTR,A
说明:
1.在51中,与外部存储器RAM打交道的只可以是A累加器。所有
需要送入外部RAM的数据必需要通过A送去,而所有要读入的外部
RAM中的数据也必需通过A读入。
在此我们可以看出内外部RAM的区别了,内部RAM间可以直接进
行数据的传递,而外部则不行。
比如,要将外部RAM中某一单元(设为0100H单元的数据)送入
另一个单元(设为0200H单元),也必须先将0100H单元中的内容读
入A,然后再送到0200H单元中去。 2.要读或写外部的RAM,当然也必须要知道RAM的地址,
在后两条指令中,地址是被直接放在DPTR中的。而前两条
指令,由于Ri(即R0或R1)只是8位的寄存器,所以只提
供低8位地址。高8位地址由P2口来提供。
3.使用时应先将要读或写的地址送入DPTR或Ri中,然后
再用读写命令。
例:将外部RAM中100H单元中的内容送入外部RAM中200H
单元中。
MOV DPTR,#0100H
MOVX A,@DPTR
MOV DPTR,#0200H
MOVX @DPTR,A3.3.3 读程序存储器指令(2条)
MOVC A,@A+DPTR
MOVC A,@A+PC
本组指令是将ROM中的数送入A中。本组指令也被称为查表指令,
常用此指令来查一个已做好在ROM中的表格
说明:查找到的结果被放在A中,因此,本条指令执行前后,A
中的值不一定相同。
例:有一个数在R0中,要求用查表的方法确定它的平方值(此
数的取值范围是0-5)
MOV DPTR,#100H
MOV A,R0
MOVC A,@A+DPTR
. …
ORG 0100H
DB 0,1,4,9,16,25
如果R0中的值为2,
则最终地址为
100H+2为102H,
到102H单元中找到
的是4。3.3.4 堆栈操作(2条)
PUSH direct ;SPSP+1,(SP)(direct)
POP direct ; (direct) (SP), SPSP-1
第一条为压入指令,就是将direct中的内容送入堆栈中,
第二条为弹出指令,就是将堆栈中的内容送回到direct中。
例: MOV SP,#5FH
MOV A,#100
MOV B,#20
PUSH ACC
PUSH B
则执行第一条PUSH ACC指令是这样的:将SP中的值加1,即变
为60H,然后将A中的值送到60H单元中,因此执行完本条指令后,
内存60H单元的值就是100,同样,执行PUSH B时,是将SP+1,即变
为61H,然后将B中的值送入到61H单元中,即执行完本条指令后,
61H单元中的值变为20。1.给出每条指令执行后的结果
MOV 23H,#30H
MOV 12H,#34H
MOV R0,#23H
MOV R7,12H
MOV R1,#12H
MOV A,@R0
MOV 34H,@R1
MOV 45H,34H
MOV DPTR,#6712H
MOV 12H,DPH
MOV R0,DPL
MOV A,@R0
;(23H)=30H
;(12H)=34H
;R0=23H
XX
XX
XX
XX
XX
XX
XX
XX
XX
DPH
DPL
45H
34H
23H
12H
R7
R1
R0
XX
XX
XX
XX
30
34
XX
XX
23
XX
XX
XX
XX
30
34
34
12
23
67
12
34
34
30
34
34
12
23
67
12
34
34
30
67
34
12
12
;R7=34H
;R1=12H
;A=30H
;(34H)=34H
;(45H)=34H
;DPTR=6712H
;(12H)=67H
;R0=12H
;A=67H
内部RAM§3.4 算术运算类指令(24条)
Arithmetic Operations
主要对8位无符号数;也可用于带符号数运算。
包括:加、减、乘、除、加1、减1运算指令
影响PSW有关位。 3.4.1 加法指令
ADD A,#data ; A+data→A
ADD A,direct ; A+(direct )→A
ADD A,Rn ; A+Rn→A
ADD A,@Ri ; A+(Ri)→A
用途:将A中的值与源操作数所指内容相加,最终结果
存在A中。
1.不带进位位的加法指令(4条)2.带进位位的加法指令(4条)
ADDC A,Rn ; A+Rn+CY→A
ADDC A,direct ; A+(direct )+CY→A
ADDC A,@Ri ; A+(Ri)+CY→A
ADDC A,#data ; A+data+CY→A
用途:将A中的值和其后面的值以及进位位C中的值相加,
最终结果存在A,常用于多字节数运算中。
说明:由于51单片机是一种8位机,所以只能做8位的数学
运算,但8位运算的范围只有0~255,这在实际工作中是不
够的,因此就要进行扩展,一般是将2个8位(两字节)的数
学运算合起来,成为一个16位的运算,这样,可以表达的
数的范围就可以达到0~65535。例:
先做67H+A0H=107H,而107H显然超过了0FFH
,因此最终保存在A中的是07H,而1则到了PSW中
的CY位了。换言之,CY就相当于是100H。
然后再做10H + 30H + CY,结果是41H,所以
最终的结果是4107H。
1067H+30A0H
0001 0000 0110 0111
0011 0000 1010 0000
0100 0001 0000 0111
1067H
30A0H
4107H设:1067H存在R1R0中, 30A0H存在R3R2中,计算
R1R0+R3R2,结果存在R5R4中。
MOV A,R0
ADD A,R2 ;R0+R2→A和CY
MOV R4,A
MOV A,R1
ADDC A,R3 ;R1+R3+CY→A和CY
MOV R5,A又例:
先做67H+20H=87H,没有超过0FFH,因此最终
保存在A中的是87H,而PSW中的CY=0。
然后再做10H + 30H + CY,结果是40H,所以
最终的结果是4087H。
1067H+3020H
0001 0000 0110 0111
0011 0000 0010 0000
0100 0000 1000 0111
1067H
3020H
4087HDA A
在进行BCD码加法运算时,跟在ADD和ADDC指令
之后,用于对累加器A中刚进行的两个BCD码的加法
的结果进行十进制调整。
例:A=0001 0101BCD(代表十进制数15)
ADD A,#8
3. 十进制调整指令(1条)
; A=1DH,按二进制规律加
; A=23H,按十进制规律加DA A 调整要完成的任务是:
(1)当累加器A中的低4位数出现了非
BCD码(1010~1111)或低4位产生进
位(AC=1),则应在低4位加6调整,以
产生低4位正确的BCD结果。
(2)当累加器A中的高4位数出现了非
BCD码(1010~1111)或高4位产生进位
(CY=1),则应在高4位加6调整,以产生
高4位正确的BCD结果。
十进制调整指令执行后,PSW中的CY表
示结果的百位值。例例 若(若(AA)=)=0101 0110B0101 0110B,表示的,表示的BCDBCD码为码为5656,,
((R3R3)=)=0110 0111B0110 0111B,表示的,表示的BCDBCD码为码为6767,(,(CYCY)=)=00。。
执行以下指令:执行以下指令:
ADD AADD A,,R2R2
DA ADA A
由于(由于(AA)=)=0010 0011B0010 0011B,即,且(,即,且(CYCY)=)=11,即,即
结果为结果为BCDBCD数数123123。。
应该注意,应该注意,DADA指令不能对减法进行十进制调整。指令不能对减法进行十进制调整。3.4.2 减法指令(8条)
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
将A中的值减去源操作数所指内容以及进位位C中的
值,最终结果存在A中。
如: SUBB A,R2
设: A=C9H,R2=55H,CY=1,
执行指令之后,A中的值为73H。
1. 带借位的减法指令(4条)说明:没有不带借位的减法指令,如果需要做
不带位的减法指令(在做第一次相减时),只要将
CY清零即可。
对带符号数,要注意OV标志。OV=1,出错。§3.5 逻辑运算类指令(24条)
主要用于对2个操作数按位进行逻辑操作,结果送到
A或直接寻址单元。
主要操作
与、或、异或、移位、取反、清零等。
对标志位的影响
除了目的操作数为ACC的指令影响奇偶标志P外,
一般不影响标志位。
Logic Operations3.5.1 逻辑或指令(6条)
ORL A,Rn ;A∨Rn→A
ORL A,direct ;A∨(direct)→A
ORL A,@Ri ;A∨(Ri)→A
ORL A,#data ;A∨data→A
ORL direct,A ;(direct)∨A→(direct)
ORL direct,#data ;(direct)∨data→(direct)
影响P标志
例:71H和56H相或:
01110001 (71H)
∨) 01010110 (56H)
01110111 即77H
后两条指令,若直接地址为I/O端口,则为“读-改
写”操作。
OR Logic Instruction3.5.2 逻辑与指令 (6条)
ANL A,Rn ;A∧Rn→A
ANL A,direct ;A∧(direct)→A
ANL A,@Ri ;A∧(Ri)→A
ANL A,#data ;A∧data→A
ANL direct,A ;(direct)∧A→(direct)
ANL direct,#data ;(direct)∧data→(direct)
影响P标志
例:71H和56H相与:
01110001 (71H)
∧)01010110 (56H)
01010000 即50H
后两条指令,若直接地址为I/O端口,则为“读-改
写”操作。
ANd Logic Instruction例:71H和56H相异或:
01110001 (71H)
⊕) 01010110 (56H)
3.5.2 逻辑异或指令(6条)
XRL A,Rn ;A ⊕Rn→A
XRL A,direct ;A ⊕(direct)→A
XRL A,@Ri ;A ⊕(Ri)→A
XRL A,#data ;A ⊕ data→A
XRL direct,A ;(direct) ⊕A→(direct)
XRL direct,#data ;(direct) ⊕data→(direct)
影响P标志
00100111 即27H
后两条指令,若直接地址为I/O端口,则为“读-改
写”操作。
eXclusive-oR Logic Instruction3.5.3 清0与取反指令(2条)
取反:CPL A ;/A→A
例:若A=5CH,执行CPL A
结果:A=A3H
清0:CLR A ;0→A
ComPlement Logic Operation3.5.4 循环移位指令(4条)
RL A
RR A
RLC A
RRC A
A.7 A.0
A.7 A.0
A.7 A.0CY
CY A.7 A.0
后两条指令,影响P标志和CY。
Rotate Logic instruction例:
若A=5CH,CY=1,执行RLC A后,
对RLC、RRC指令,在CY=0时
RLC相当于乘以2
RRC相当于除以2
结果:A=B9H,CY=0,P=1
0101 11001 1011 10010§3.6 控制转移类指令( 17条)
Branching Instruction
共有控制程序转移类指令(不包括位操作类的转移
指令)。此类指令一般不影响PSW。
包括以下类型:
. 无条件转移和条件转移
. 相对转移和绝对转移
. 长转移和短转移
. 调用与返回指令3.6.1 无条件转移类指令(4条)
. 短转移类指令:AJMP addr11
. 长转移类指令:LJMP addr16
. 相对转移指令:SJMP rel
. 间接转移指令:JMP @A+DPTR
(1)上面的前三条指令,统统理解成:PC值改变,即
跳转到一个标号处。
那么他们的区别何在呢?跳转的范围不同。
. 短转移类指令:AJMP addr11
. 长转移类指令:LJMP addr16
. 相对转移指令:SJMP rel
转移范围:
2KB
64KB
-128~+127
指令构成不同。
AJMP、LJMP后跟的是绝对地址,
而SJMP后跟的是相对地址。
指令长度不同
原则上,所有用SJMP或AJMP的地方都可以用
LJMP来替代。.间接转移指令:JMP @A+DPTR
这条指令的用途也是跳转,转到什么地方去呢
?这可不能由标号简单地决定了。
转移地址由A+DPTR形成,并直接送入PC。
指令对A、DPTR和标志位均无影响。
本指令可代替众多的判别跳转指令,又称为散
转指令,多用于多分支程序结构中。
(2)第四条指令与前三条指令相比有所不同例: MOV DPTR,#TAB ;将TAB代表的地址送入DPTR
JMP @A+DPTR ;跳转
TAB: AJMP ROUT0 ;跳转ROUT0开始的程序段
TAB+2: AJMP ROUT1 ;跳转ROUT1开始的程序段
TAB+4: AJMP ROUT2 ;跳转ROUT2开始的程序段
TAB+6: AJMP ROUT3 ;跳转ROUT3开始的程序段
...
ROUT0:
...
ROUT1:
...
ROUT2:
...
ROUT3:
执行该段程序后,程序将根
据A中的内容转移到不同的
程序段去执行----散转。
A=0,转ROUT0
A=2,转ROUT1
A=4,转ROUT2
A=6,转ROUT33.6.2 条件转移指令(8条)
条件转移指令是指在满足一定条件时进行相对转
移,否则程序继续执行本指令的下一条指令。
一、判A内容是否为0转移指令(2条)
JZ rel ;如果A=0,则转移,否则顺序执行。
JNZ rel ;如果A≠0,就转移。
转移到相对于当前PC值的8位移量的地址去。即:
新的PC值=当前PC+偏移量rel
我们在编写汇编语言源程序时,可以直接写成:
JZ 标号 ;即转移到标号处。例: MOV A,R0
JZ L1
MOV R1,#00H
AJMP L2
L1: MOV R1,#0FFH
L2: SJMP L2
END
在执行上面这段程序前:如果R0=0,结果R1=0FFH。
而如果R00,则结果是R1=00H。
把上面的那个例子中的JZ改成JNZ,看看程序执行的
结果是什么?
如果R0=0,结果R1=00H。如果R0 0,结果是R1中的
值为0FFH。二、比较不等转移指令(4条)
CJNE A,#data,rel
CJNE A,direct,rel
CJNE Rn,#data,rel
CJNE @Ri,#data,rel
此类指令的功能是将两个操作数比较,如果两者相等,就
顺序执行,如果不相等,就转移。
同样地,使用时,我们可以将rel理解成标号,即:
CJNE A,#data,标号
CJNE A,direct,标号
CJNE Rn,#data,标号
CJNE @Ri,#data,标号利用这些指令,可以判断两数是否相等。
但有时还想得知两数比较之后哪个大,哪个小,
本条指令也具有这样的功能:
如果两数不相等,则CPU还会用CY(进位位)
来反映哪个数大,哪个数小。
如果前面的数大,则CY=0,否则CY=1。
因此在程序转移后再次利用CY就可判断出哪个
数大,哪个数小了。举例:
MOV A,R0
CJNE A,#10H,L1
MOV R1,#0 ;如R0=10H,则不转移R1=00H;
AJMP L3
L1:JC L2 ;如CY=1即 R010H,则转移
AJMP L3
L2:MOV R1,#0FFH
L3:SJMP L3
因此最终结果是:本程序执行前,
如果R0=10H,则R1=00H;
如果R0>10H,则R1=0AAH;
如果R0
查看更多