指令系统
微型机的功能是由指令系统体现的。所以,寻址方式和指令系统是衡量微型机的重要指标。
MSC-51的指令系统一共有111条指令,包括单字节49条,双字节46条和三字节16条。按周期分,有单周期,双周期和三周期指令。在晶振频率为12MHZ时,三种不同周期的指令执行的时间分别为1
μ
s
{\mu}s
μs、2
μ
s
{\mu}s
μs、4
μ
s
{\mu}s
μs.
按照功能来分一共可以分为以下五类
- 数据传送类指令
- 算数运算类指令
- 逻辑运算类指令
- 程序控制类指令
- 位(布尔)操作类指令
-
数据传送类指令:
数据传送类指令是最常用,最基本的一类指令。它们可以实现寄存器与寄存器之间、寄存器与片内RAM之间、片内RAM单元之间的数据传送等。
-
八位数通用传送指令
-
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位循环移位指令
-
算数运算类指令
-
逻辑运算类指令
-
控制转移类指令
-
位操作类指令
-
单片机从硬件到软件构成了完整的按位操作的不二处理器,也称为位处理器。在这里面,CPU不是以字节或者字而是以位作为处理对象进行操作的。进行位操作的时候,以进位标志CY作为位累加器,具有一套按位处理指令集,包括数据传送,位逻辑运算和位条件控制转移等指令。
-
MSC-51单片机内部诗句存储器中,有两部分按位寻址的存储地址空间:一部分是片内RAM的20H~2FH共16个字节单元128位,位地址为00H-7FH,各位地址相应于从20H字节单元的最低位开始,到2FH字节单元的最高位;另一部分是特殊功能寄存器区,字节地址能被8整除的专用寄存器也具有位地址,其位地址从80H-F7H.中间有极少数位没有被定义,这部分不能按位寻址。
-
在汇编语言中,位地址的表达方式有以下几种:
-
直接用位地址表示,如
D4H,2FH
-
用点操作符号表示。点操作符前面部分是字节地址或者是可以被位寻址的专用寄存器,后面部分的数字表示它们的位。
例如:(D0H).4,PSW.4
-
寄存器的位定义名称。如:RS1.0V
-
用户定义的位符号地址。例如:L1 BIT PSW.4,将PSW.4定义为位符号地址L1之后,允许在指令中使用L1代替PSW.4
-
位数据传送指令
MOV C,bit ;CY<-(bit)
MOV bit,C
;注意的是,其中的一个操作数必须是位累加器CY,另一个操作数可以是任何可以被直接寻址的位
-
位状态修改指令
CLR C ;清零
CLR bit
CPL C ;逻辑取反
CPL bit
SETB C ;重置位1
SETB bit
-
位逻辑运算指令
ANL C,bit ;C AND BIT
ANL C,/bit ;C AND !BIT
ORL C,bit
ORL C,/bit
-
位条件转移指令
JB bit,rel ;若(bit)=1,则PC<-PC+rel,否则,PC<-PC+3 J BIT
JNB bit,rel ;若(bit)=0,则PC<-PC+rel,否则,PC<-PC+3 J NOT BIT
JBC bit,rel ;若(bit)=1,则PC<-PC+rel,同时bit清零;否则,PC<-PC+3,bit清零 J B CLR
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)