指令系统
微型机的功能是由指令系统体现的。所以,寻址方式和指令系统是衡量微型机的重要指标。
MSC-51的指令系统一共有111条指令,包括单字节49条,双字节46条和三字节16条。按周期分,有单周期,双周期和三周期指令。在晶振频率为12MHZ时,三种不同周期的指令执行的时间分别为1 μ s {\mu}s μs、2 μ s {\mu}s μs、4 μ s {\mu}s μs.
按照功能来分一共可以分为以下五类
- 数据传送类指令
- 算数运算类指令
- 逻辑运算类指令
- 程序控制类指令
- 位(布尔)操作类指令
-
数据传送类指令:
数据传送类指令是最常用,最基本的一类指令。它们可以实现寄存器与寄存器之间、寄存器与片内RAM之间、片内RAM单元之间的数据传送等。
-
八位数通用传送指令
-
MOV 目的,源
指令中,源操作数是指带传送的数据源,它可以是立即数、累加器A,工作寄存器或片内RAM存储单元;目的操作数是指数据源传送到的目的地,不能是立即数。
指令执行后,源操作数不变,目的操作数被改变。
-
累加器A为目的的操作数的指令
MOV A,Rn;A<-Rn MOV A,direct;A<-(direct) MOV A,@Ri;A<-(Ri) MOV A,#data;A<-data
-
工作寄存器Rn为目的的操作数的指令
MOV Rn,A;Rn<-A 传送的是A中保存的数 MOV Rn,direct;Rn<-(direct) MOV Rn,#data;Rn<-data ;把源操作数的累加器A,片内RAM单元,SFR内容或立即数传送到R0~R7的某个寄存器中
-
直接地址为目的操作数的指令
MOV direct,A;(direct)<-A MOV direct,Rn;(direct)<-Rn MOV direct,direct;(direct)<-(direct) MOV direct,@Ri;(direct)<-Ri MOV direct,#data;(direct)<-data ;需要注意的是:MOV direct,direct和MOV direct,#data均为三字节指令,但汇编后,它们的指令机器代码排列顺序不同。 ;操作码 源direct 目的direct(源地址在前,目的地址在后) ;操作码 direct data 目的地址在前,源操作数在后
-
间接地址为目的操作数的指令
MOV @Ri,A;(Ri)<-A 把A中的数传送给(Ri)地址下保存的数。比如Ri=30H,A=20H,则操作后(30H)=20H MOV @Ri,direct;(Ri)<-(direct) MOV @Ri,#data;(Ri)<-data
-
-
-
16位数目标地址传送指令
MOV DPTR,#data 16 ;唯一的16位立即数传送指令 ;DPTR是一个16位的地址寄存器,所以通常称16位立即数为目标地址 ;这也是一个三字节的指令。汇编成机器码的时候,立即数的高位字节在前,低位字节在后 MOV DPTR,#2068H ;机器代码 90 20 68
-
堆栈操作指令
PUSH direct ;SP<-SP+1,(SP)<-(direct) POP direct ;(direct)<-(SP),SP<-SP-1 ;SP始终指向栈顶,PUSH是入栈指令,POP是出栈指令 ;eg:设SP=30H,(50H)=80H PUSH 50H ;SP从30H变为31H,同时把(50H)->(31H) POP 40H ;把(31H)->(40H),同时SP从31H变为30H
-
查表指令(程序存储器内容送累加器A)
-
主要有两条
-
查表指令(以PC作为基址)
MOVC A,@A+PC ;PC<-PC+1,A<-(A+PC) ;通过将PC当前值与累加器A中的地址偏移量相加,将得到的地址中间的数取给A ;步骤如下: ;1.将地址偏移量(待查数据表的项数)送累加器A ;2.用加法指令(ADD A,#data)对累加器A进行修正,修正量data由PC(CURRENT)+data=数据表首地址计算出 ;若data=1,则可以采用INC A指令对A进行修正 ;这里主要是通过参考PC地址在PC后面进行查表。这里面数据只能存放在PC的后面,且需要与命令保持一定的间距
-
查表指令(以DPTR作为基址)
MOVC A,@A+DPTR ;A<-A+DPTR ;这是一条单字节指令,以DPTE为基址寄存器,存放数据表的首地址 ;由于DPTR为一个十六位的寄存器,可以任意设定初值,因此数据表可以随意设置。 ORG 0200H HEXABC: MOV DPTR,#DTAB ;置数据表首地址 MOVC A,@A+DPTR ;查表 RET DTAB: DB 30H ;... DB 39H ;... DB 46H ;这里面取DTAB的值就是DTAB所在的地址
-
-
-
累加器A与片外数据存储器传送指令
-
CPU访问片外数据存储器RAM时,只能通过累加器A进行,包括读取片外RAM的数据和把数据写到片外RAM存储单元中。指令如下:
MOVX A,@Ri ;A<-(Ri) MOVX A,@DPTR ;A<-(DPTR) MOVX @Ri,A ;(Ri)<-A MOVX @DPTR,A ;(DPTR)<-A
例如,把片内RAM 40H单元中的内容送到片外RAM2000H单元中去:
MOV A,40H MOV DPTR,#2000H MOVX @DPTR,A ;访问外部只有上面的四个操作,其他操作都是违规的
-
-
交换指令
-
交换指令一共有五条:
-
字节交换指令
XCH A,Rn ;A<->Rn XCH A,direct ;A<->direct XCH A,@Rn ;A<->(Ri) ;XCH的功能是将累加器A中的内容与源操作数所指的数据互相交换
-
半字节交换指令
XCHD A,@Ri ;A.3~A.0<->(Ri.3~Ri.0) ;该指令的功能是,将累加器A中的低四位与Ri间接寻址单元内容的低四位相互交换,而各自的高四位的内容不变。 ;对于十六进制位来说,就是只交换个位的数字
-
累加器A的高四位与低四位内容呼唤指令
SWAP A ;A.3~A.0<->A.7~A.4 ;将A的高、低两半字节相互交换。本指令也可以看作4位循环移位指令
-
-
-
-
算数运算类指令
-
MCS-51算数运算类指令主要是对8位无符号二进制数进行加减乘除四则运算。增一,减一;实现对BCD码的压缩。一共有24条
-
在加法,带进位的假发和带借位的剑法的指令中,累加器A中总是存放着目的操作数,并存放操作的中间结果。这些指令都影响程序状态字寄存器PSW的进位位CY,溢出位OV,半进位位AC和奇偶标志位P。乘法和除法只影响标志位OV和P
-
加法类指令
主要有四条
ADD A,Rn ;A<-A+Rn ADD A,direct ;A<-A+(direct) ADD A,@Ri ;A<-A+(Ri) ADD A,#data ;A<-A+data
-
带进位的加法指令
ADDC A,Rn ;A<-A+Rn+CY ADD A,direct ;A<-A+(direct)+CY ADD A,@Ri ;A<-A+(Ri)+CY ADD A,#data ;A<-A+data+CY
-
加一指令
INC A INC Rn INC direct INC @Ri INC DPTR ;把操作数所指定单元的内容加一。其操作除了第一条指令影响奇偶标志位外,其余指令操作均不影响PSW。程序设计中,+1指令的使用十分频繁,通常配合寄存器间址指令使用,用于修改地址指针。
-
带借位的减法指令
SUBB A,Rn SUBB A,direct SUBB A,@Ri SUBB A,#data ;A<-A-Rn-CY
-
减一指令
DEC A ;A<-A-1 DEC Rn DEC direct DEC @Ri ;这组指令的功能是把操作数所指定的单元内容减一,其操作除了第一条指令影响奇偶标志外,其余指令操作均不影响PSW标志
-
乘法指令
MUL AB ;将A,B,两个八字节位的无符号数相乘。结果为16字节数。结果的高八位保存在B中,低八位保存在A中。如果B中有数,则OV(溢出位)置为一。
-
除法指令
DIV AB ;A/B 商保存在A中,余数保存在B中 ;如果被除数B为零,则OV置为1,否则置为零
-
-
-
逻辑运算类指令
-
这类指令主要用于对八字节数进行逻辑运算。包括逻辑与,或,异或,取反,以及逻辑移位指令。
-
逻辑“与”指令
ANL A,Rn ANL A,direct ANL A,@Ri ANL A,#data ANL direct,A ANL direct,#data ;前四条指令的目的操作数是累加器A,源操作数可以是工作寄存器,片内RAM和立即数。指令的功能是,将A中的内容和源操作数所指定的内容按位逻辑与,结果存入目的操作数中。 ;逻辑与指令常用于屏蔽某些位
-
逻辑“或”指令
ORL A,Rn
-
-