目录
3.1 指令系统概述
指令系统:指令的集合。
介绍MCS-51汇编语言的指令系统。
MCS-51的基本指令共111条,按指令所占的字节来分:
(1) 单字节指令49条;
(2) 双字节指令45条;
(3) 三字节指令17条。
按指令的执行时间来分:
(1) 1个机器周期(12个时钟振荡周期)指令64条
(2) 2个机器周期(24个时钟振荡周期)指令45条
(3)只有乘、除两条指令的执行时间为4个机器周期(48个时钟振荡周期)。
12MHz晶振:机器周期为1μs。
指令的长度是单字节并不一定执行起来就是一个机器周期,例如:
单字节双周期 RET
单字节四周期 乘(MUL) 除(DIV)
双字节单周期 ANL A,#00H
51指令不区分大小
3.2 指令格式
由两部分组成,即操作码和操作数。
操作码用来规定指令进行什么操作。 操作数则是指令操作的对象。
有单字节指令、双字节指令、三字节不同长度的指令,格式不同。
(1)单字节指令:指令只有一个字节,操作码和操作数同在一个字节中。
(2)双字节指令:一个字节为操作码,另一个字节是操作数。
(3)三字节指令:操作码占一个字节,操作数占二个字节。其中操作数既可能是数据,也可能是地址。
3.3 指令系统的寻址方式
寻址方式就是在指令中说明操作数所在地址的方法,一共有7种。
1.寄存器寻址方式
操作数在寄存器中:
MOV A,Rn;(Rn)→A,n=0~7
表示把寄存器Rn的内容传送给累加器A
寻址范围包括:
(1)4组通用工作寄存区共32个工作寄存器。
(2)部分特殊功能寄存器,例如A、B 以及数据指针寄存器DPTR等。
2.直接寻址方式
操作数直接以单元地址的形式给出:
MOV A,40H
寻址范围:
(1) 内部RAM的128个单元。
(2) 特殊功能寄存器。除了以单元地址的形式外, 还可用寄存器符号的形式给出。
例如: MOV A,80H 与 MOV A,P0是等价的。
3. 寄存器间接寻址方式
寄存器中存放的是操作数的地址。
在寄存器的名称前面加前缀标志 “ @”
访问内部RAM(数据存储器)或外部数据存储器的低256个字节时,只能采用R0 或R1作为间址寄存器。
例如:MOV R1,#40H
MOV A,@R1;
把内部RAM中地址为40H单元内容送A。
寻址范围:
(1)访问内部RAM区,51系列128个字节,52系列256个字节, 其通用形式为@Ri
(2)对片外数据存储器的64K字节的间接寻址,例如: MOVX A,@DPTR
(3)片外数据存储器的低256字节,不建议使用。例如:MOVX A,@Ri
(4)堆栈区
堆栈操作指令PUSH(压栈)和POP(出栈)使用堆栈指针(SP)作间址寄存器.
4.立即寻址方式
操作数在指令中直接给出,需在操作数前面加前缀 “ # ” , 若 立即数的首位为A~F,前面还要加零。例如: MOV A,#40H MOV A,#0FFH
注意区别:
-
MOV A, #40H
:- 这条指令表示立即寻址。
#
符号表示紧跟其后的数值是一个立即数,也就是说,这是一个直接嵌入到指令中的常数。40H
是一个十六进制数,表示要直接加载到累加器 A 中的值。- 因此,
MOV A, #40H
的意思是将十六进制数 40H(即十进制的 64)直接传送到累加器 A 中。
-
MOV A, 40H
:- 这条指令可能表示直接寻址,但具体的含义取决于汇编器和所用的微处理器架构。
- 在某些汇编语言中,比如8051汇编语言,没有
#
符号,直接写MOV A, 40H
表示将地址 40H 处的内存内容加载到累加器 A 中。 - 这里
40H
是一个内存地址,而不是立即数。 - 因此,
MOV A, 40H
的意思是将内存地址 40H 中的数据传送到累加器 A 中。
5.基址寄存器加变址寄存器间址寻址方式
本寻址方式是以DPTR或PC作基址寄存器,以累加器A作为变址寄存器.
例如:指令 MOVC A,@A+DPTR 其中A的原有内容为 05H,DPTR的内容为0400H,该指令执行的结果是把 程序存储器0405H单元的内容传送给A。
说明:
(1)本寻址方式是专门针对程序存储器的寻址方式, 寻址范围可达到64KB。
(2)本寻址方式的指令只有3条:
MOVC A,@A+DPTR
MOVC A,@A+PC
JMP @A+DPT
6.位寻址方式
MCS-51有位处理功能,可以对数据位进行操作,例如: MOV C,40H 是把位40H的值送到进位位C。
寻址范围包括:
(1)内部RAM中的位寻址区。位有两种表示方法,例 如,40H;另一种是单元地址加上位,例如, (28H).0,指的是28H单元中的最低位。它们是等价 的。
(2)特殊功能寄存器中的可寻址位 可寻址位在指令中有如下4种的表示方法:
a. 直接使用位地址。例如PSW.5的位地址为0D5H。
b.位名称的表示方法。例如:PSW.5是F0标志位,可使用F0表示该位。
c.单元地址加位数的表示方法。例如 :(0D0H).5。
d. 特 殊 功 能 寄 存 器 符号加位 数 的表示方法。例 如:PSW.5
7.相对寻址方式
在相对寻址的转移指令中,给出了地址偏移量,以 “rel”表示,即把PC的当前值加上偏移量就构成了程序转移的目的地址。
目的地址=转移指令所在的地址 + 转移指令的字节数 + rel
偏移量rel是一带符号的8位二进制数补码数 。
范围是:–128 ~ +127
向地址增加方向最大可转移(127+转移指令字节)个 单元地址,向地址减少方向最大可转移(128-转移 指令字节)个单元地址。
3.4 MCS-51指令系统分类介绍
111条指令,按功能分类,可分为下面5大类:
(1)数据传送类(28条)
(2)算术操作类(24条)
(3)逻辑运算类(25条)
(4)控制转移类(17条)
(5)位操作类(17条)
指令中符号的意义:
Rn 当前寄存器区的8个工作寄存器R0~R7(n=0~ 7)。
Ri 当前选中的寄存器区中可作间接寻址寄存器的2个寄存器R0、R1(i=0,1)。
Direct 直接地址,即8位的内部数据存储器单元或 特殊功能寄存器的地址。
#data 包含在指令中的8位立即数。
#data16 包含在指令中的16位立即数。
rel 相对转移指令中的偏移量,为8位的带符号补码数
DPTR 数据指针,可用作16位的数据地址寄存器。
bit 内部RAM或特殊功能寄存器中的直接寻址位。
C(或Cy) 进位标志位或位处理机中的累加器。
addr11 11位目的地址
addr16 16位目的地址
@ 间接寻址寄存器前缀,如@Ri,@A+DPTR
(X) X中的内容。
((X)) 由X寻址的单元中的内容。
→ 箭头右边的内容被箭头左边的内容所取代。
3.4.1 数据传送类指令
使用最频繁的一类指令,通用格式: MOV <目的操作数><源操作数>, 属“复制”性质,而不是“搬家”
数据传送类指令不影响标志位, Cy、Ac和OV,但不包括奇偶标志位P。
1.以累加器为目的操作数的指令
MOV A,Rn ; (Rn)→A,n=0~7
MOV A,@Ri ; ((Ri))→A,i=0,1
MOV A,direct ;(direct)→A
MOV A,#data ; #data→A
例如:
2. 以Rn为目的操作数的指令
MOV Rn,A ; (A)→Rn,n=0~7
MOV Rn,direct ;(direct)→Rn,n=0~7
MOV Rn,#data ; #data→Rn,n=0~7
功能:是把源操作数的内容送入当前一组工作寄存器区的R0~R7中的某一 个寄存器。
3.以直接地址direct为目的操作数的指令
MOV direct,A ; (A)→direct
MOV direct,Rn; (Rn)→direct, n=0~7
MOV direct1,direct2;
MOV direct,@Ri ; ((Ri))→direct
MOV direct,#data; #data→direct
功能:把源操作数送入直接地址指出的存储单元。direct指的是内部RAM或 SFR的地址
4.以寄存器间接地址为目的操作数的指令
MOV @Ri,A ;(A)→((Ri)),i=0,1
MOV @Ri,direct ; (direct)→((Ri))
MOV @Ri,#data ; #data→((Ri))
5.16位数传送指令
MOV DPTR,#data16 ; #data16→DPTR
唯一的16位数据的传送指令 ,立即数的高8位送入 DPH,立即数的低8位送入DPL
6.堆栈操作指令
MCS-51内部RAM中可以设定一个后进先出(LIFO-Last In First Out)的区域称作堆栈.
堆栈指针SP指出堆栈的栈顶位置。
(1)进栈指令 PUSH direct
先将栈指针SP加1,然后把direct中的内容送到栈指针SP指示 的内部RAM单元中。
例如:
(2)出栈指令
POP direct
SP指示的栈顶(内部 RAM单元)内容送入 direct字节单元中,栈指针SP减1
例如:
不遵循先进后出原则的问题:
7.累加器A与外部数据存储器传送指令
MOVX A,@DPTR ;((DPTR))→A,读外部RAM/IO
MOVX A,@Ri ;((Ri))→A,读外部RAM/IO
MOVX @DPTR,A;(A)→((DPTR)),写外部RAM/IO
MOVX @Ri,A ;(A)→((Ri)),写外部RAM/IO
功能:读外部RAM存储器或I/O中的一个字节,或把A中 一个字节的数据写到外部RAM存储器或I/O中。
注意:RD *或WR *信号有效。
采用DPTR间接寻址,高8位地址(DPH)由P2口输出, 低8位地址(DPL)由P0口输出。
采用Ri(i=0,1)间接寻址,可寻址片外256个单元的数据存储器。Ri内容由P0口输出.
8位地址和数据均由P0口输出,可选用其它任何输出口线来输出高于8位的地址(一般选用P2口输出高8位 的地址)。
MOV后 “ X ”表示单片机访问的是片外RAM存储器或I/O。
8.查表指令
共两条,用于读程序存储器中的数据表格的指令,均采用基址寄存器加变址寄存器间接寻址方式。
(1) MOVC A,@A+PC
以PC作基址寄存器,A的内容作为无符号整数和PC中的内容(下一条指令的起始地址)相加后得到一个16 位的地址,该地址指出的程序存储单元的内容送到累加器A。
注意:PSEN *信号有效
例如:
(2) MOVC A,@A+DPTR
以DPTR作为基址寄存器,A的内容作为无符号数和DPTR 的内容相加得到一个16位的地址,把由该地址指出 的程序存储器单元的内容送到累加器A.
9.字节交换指令
XCH A,Rn
XCH A,direct
XCH A,@R
10.半字节交换指令
XCHD A,@Ri
累加器的低4位与内部RAM低4位交换。
3.4.2 算术操作类指令
单字节的加、减、乘、除法指令,都是针对8 位二进制无符号数。 执行的结果对Cy、Ac、OV 三种标志位有影响。 但增1和减1指令不影响上述标志
1.加法指令
一个加数总是来自累加器A,而另一个加数可由不同的寻址方式得到。结果总是放在A中。 使用加法指令时,要注意累加器A中的运算结果对各个标志位的影响。
(1)如果位7有进位,则置“1”进位标志Cy,否则清“0”Cy。
(2)如果位3有进位,置“1”辅助进位标志Ac,否则清“0”Ac(Ac为PSW寄存 器中的一位)
(3)如果位6有进位,而位7没有进位,或者位7有进位,而位6没有,则溢 出标志位OV置“1”,否则清“0”OV。即(位6和位7同时进位则OV=0),否则AC=1.
(4)当结果1的个数为奇数时,P=1,否则P=0。
2.带进位加法指令
3.增1指令
4.十进制调整指令
用于对BCD码十进制数加法运算结果的内容修正。
指令格式: DA A
两个压缩BCD码的数按二进制相加之后,必须经本指令的调整才能得到正确的和数(仍为压缩BCD码表示)
应用背景:
(1)该指令执行前,一般有一条加法指令。
(2)加法指令中的两个加数,应该是用压缩 BCD码表示的十进制数,和存放在A中。
(3)执行完DA指令后,A中存放的数是两个加数的十进制和,也使用压缩BCD码表示。
5.带借位的减法指令
从累加器A中的内容减去指定的变量和进位标志Cy的值,结果存在累加器A中。
如果位7需借位则置 “ 1 ” Cy,否则清 “ 0 ”Cy;
如果位3需借位则置 “ 1 ”Ac,否则清 “ 0 ”Ac;
如果位6需借位而位7不需要借位,或者位7需借位,位6不需借 位,则置 “ 1 ”溢出标志位OV,否则清 “ 0 ”OV。(即位6和位7同时借位时,OV = 1)
6.减1指令
7.乘法指令
MUL AB ;A×B→BA
如果积大于255,则置“1”溢出标志位OV
8.除法指令
DIV AB ;A/B→A(商),余数→B
如果B的内容为“0”(即除数为“0”),则存放结果的 A、B中的内容不定,并置“1”溢出标志位OV。
3.4.3 逻辑运算指令
1. 简单逻辑操作指令
(1) CLR A
功能是累加器A清“0”。不影响Cy、Ac、OV等标志。
(2) CPL A
功能是将累加器A的内容按位逻辑取反,不影响标志.
2.左环移指令
RL A
功能是累加器A的8位向左循环移位,位7循环移入 位0,不影响标志。
3.带进位左环移指令
RLC A
功能是将累加器A的内容和进位标志位Cy一起向左环移一位,Acc.7移入进位位Cy,Cy移入Acc.0,不影 响其它标志。
4.右环移指令
RR A
功能是累加器A的内容向右环移一位,Acc.0移入Acc.7,不影响其它标志。
5.带进位环移指令
RRC A
这条指令的功能是累加器A的内容和进位标志Cy一起向右环移一位,Acc.0 进入Cy,Cy移入Acc.7。
6.累加器半字节交换指令
SWAP A
将累加器A的高半字节(Acc.7~Acc.4)和低半字节(Acc.3~Acc.0)互 换.
7.逻辑与指令(两个同时为1,才是1)
8.逻辑或指令(有1则1)
9.逻辑异或指令
3.4.4 控制转移类指令
1.无条件转移指令
AJMP addr11
2K字节范围内的无条件跳转指令, 64K程序存储 器空间分为32个区,每区2K字节,转移的目标地址必须与AJMP下一条指令的地址(pc)的高5位地 址码A15 ~A11相同。
**本指令是为能与MCS-48的JMP指令兼容而设的。 不建议使用
2.长跳转指令
LJMP addr16
指令执行时把指令的第二和第三字节分别装入PC 的高位和低位字节中,无条件地转向addr16指 出的目标地址。目标地址可以在64K程序存储 器地址空间的任何位置.
3.相对转移指令
SJMP rel
在编写程序时,直接写上要转向的目标地址标号就可以,由汇编程序自动计算和填入偏移量。 跳转目标地址处于当前PC值的 -128字节-- +127字节之间.
跳转目的地址超过-128~127区间的处理
4.间接跳转指令
JMP @A+DPTR
由A中8位无符号数与DPTR的16位数内容之和来确定。以DPTR内 容作为基址,A的内容作变址。 给A赋予不同的值,即可实现程序的多分支转移。
5.条件转移指令
6.比较不相等转移指令
7.减1不为0转移指令
这是一组把减1与条件转移两种功能结合在一起的指令。共两条指令:
DJNZ Rn,rel ;n=0~7
DJNZ direct,rel
将源操作数(Rn或direct)减1,结果回送到Rn寄存器或 direct中去。如果结果不为0则转移,转移的目的地址要求 同SJMP.
允许程序员把寄存器Rn或内部RAM的direct单元用作程序循环计数器。主要用于控制程序循环。以减1后是否为“0”作 为转移条件,即可实现按次数控制循环.
8.调用子程序指令
(1)短调用指令
ACALL addr11
与AJMP指令相类似,是为了与MCS-48中的CALL 指令兼容而设的,不建议使用
(2)长调用指令
LCALL addr16
该指令执行时,MCS51执行如下操作:
(1)当前PCL、PCH进栈
(2)addr 16 送入PC.
9.子程序的返回指令
10.中断返回指令
RETI
功能与RET指令相似,两指令不同之处,是本指令清 除了中断响应时,被置“1”的MCS-51内部中断优先 级寄存器的优先级状态
11.空操作指令
NOP
3.4.5 位操作指令
1.数据位传送指令
2.位变量修改指令
CLR C ;清“0”Cy
CLR bit ;清“0”bit位
CPL C ;Cy求反
CPL bit ;bit位求反
SETB C ;置 “ 1 ” Cy
SETB bit ;置 “ 1 ” bit位
这组指令将操作数指出的位清 “ 0 ”、求反、置 “ 1 ” , 不影响其它标志
3.位变量逻辑与指令
ANL C,bit ;bit∧Cy→Cy
ANL C,/bit; ;/bit ∧Cy→C
4.位变量逻辑或指令
ORL C,bit
ORL C,/bit