#指令系统
指令格式
指 令 通 常 由 指 令 操 作 码 和 指 令 操 作 数 两 部 分 组 成
指令描述符号
- A:表示累加器A,而ACC则表示累加器A的地址。
- Rn(n = 0~7):当前选中的工作寄存器组中寄存器R0~R7之一。
- Ri(i = 0, 1):当前选中的工作寄存器组中的寄存器R0或R1。
- @:间接寻址或变址寻址前缀。
- data:8位立即数。
- data16:16位立即数。
- direct:片内低128个RAM单元地址及SFR地址。
- addr11:11位目的地址。
- addr16:16位目的地址。
- rel:一个字节的补码表示的地址偏移量,范围为128~+127。
- bit:位寻址空间中可寻址位的地址。
- (X):表示X地址单元或寄存器中的内容。
- ((X)):以X单元或寄存器中的内容作为地址所指定单元的内容。
- /:位操作数的取反操作前缀,表示对该数位取反,但不影响该数位的原值。
- →:数据传送方向,表示箭尾一侧的内容送入箭头所指向的单元中去。
- :表示数据交换。
指令格式
-
单字节指令/:只有操作码,无操作数,操作数隐含在操作码中。
-
双字节指令/:一个字节表示操作码,另一个字节表示立即数或存放操作数的地址。
-
三字节指令/:第一个字节表示操作码,后两个字节表示操作数或操作数地址。
-
注释:
- 单指令、一般格式为
操作助记符 [操作数] [;注释] - 双指令、一般格式如下所示:
操作助记符 [目的操作数][,源操作数][;注释]
- 单指令、一般格式为
寻址方式
不同的计算机其寻址方式不尽相同,一般来说,寻址方式越多,计算机功能就越强,灵活性也越大。51系列单片机共有7种寻址方式
立即寻址
指令编码中直接给出操作数的寻址方式称为立即寻址。
在这种寻址方式中,紧跟在操作码后面的操作数称为立即数。
立即数可以是一个字节,也可以是两个字节,立即数以前缀“#” 符号来标识。MOV A,#03H
直接寻址
直接寻址是指操作数的地址直接在指令中给出的寻址方式。
该地址对应单元中的内容就是操作数,
直接的操作数单元地址用“direct”表示。
MOV A,3CH ;(3CH)→A
寄存器寻址
操作数存放在寄存器中的寻址方式称为寄存器寻址。
对于这种寻址方式,寻址的寄存器已隐含在指令的操作码中,寄存器用符号Rn表示。
指令译码其实是译码的是操作码
假设(R1) = 0FFH,
执行指令:MOV A,R1 ; (R1)→A
结果:(A) = 0FFH
寄存器间接寻址
寄存器间接寻址是指操作数存放在以寄存器内容为地址的单元中。
寄存器中的内容不再是操作数,而是存放操作数的地址。
寄存器间接寻址用符号“@”表示。
(1)内部RAM低128单元,地址范围00H~7FH,用Ri(i = 0,1)或SP作为间址寄存器。
(2)与P2口锁存器配合使用,用Ri指示低8位地址,可寻址片外数据存储器或I/O的64KB区域。
(3)DPTR间接寻址寄存器,可寻址程序存储器或片外数据存储器(包括I/O口)各自的64KB区域。
设(R0) = 60H,
内部RAM (60H) = 50H,
执行指令MOV A,@R0 ;((R0))→A
执行结果(A) = 50H。
####变址寻址
本寻址方式以DPTR或PC作为基址寄存器,以累加器A作为变址寄存器,以两者内容相加形成的16位地址作为目的地址进行寻址。
MOVC A,@A+DPTR
MOVC A,@A+PC
JMP @A+DPTR
前两条指令称为查表指令,适用于读程序存储器中固定的数据。例如,将固定的、按一定顺序排列的表格存放在程序存储器中,在程序运行中由A的动态参量来确定读取对应的表格参数。
第3条为散转指令,A中内容为程序运行后的动态结果,可根据A中的不同内容,实现跳向不同程序入口的跳转。
设(A) = 0A4H,(DPTR) = 1234H,
程序存储区
(12D8H) = 3FH,
则执行指令MOVC A,@A+DPTR后,
(A) = 3FH。
相对寻址方式
相对寻址用于跳转指令。本寻址方式是以该转移指令的地址(PC值)加上它的字节数,再加上相对偏移量(rel),形成新的转移目的地址,从而控制程序转移到该目的地址。
-
目的地址 = 转移指令所在的地址 + 转移指令字节数 + rel
其中,偏移量rel是一个字节的补码表示的带符号数, 其范围是-128~+127。 -
因此,程序转移范围是以转移指令的下条指令首地址为基准地址,相对偏移在-128~+127单元之间。
假设指令SJMP 20H 存入2100H单元,
其机器码为80H 20H,
执行该指令后,程序将跳转到2122H单元取指令并执行
####位寻址方式
位寻址方式是指令中给出的操作数为位寻址区的位地址bit,
bit包括内部RAM的20H~2FH共16个单元的128位,以及某些 可以位寻址的特殊功能寄存器(单元地址能被8整除)的各位。
分析指令MOV C,24H.0的执行结果。
该指令的机器码为A2H 20H,相当于MOV C,20H,指令执行完成后Cy标志位为1
寻 址 方 式 就 是 CPU 在 指 令 中 寻 找 ( 确 定 ) 操 作 数 位 置 ( 地 址 ) 的 方 式 ( 或 寻 找 ( 确 定 )
转 移 的 目 标 地 址 的 方 式 ) 。
根 据 操 作 数 的 性 质 , 寻 址 方 式 分 为 数 据 寻 址 方 式 和 地 址 寻 址 方 式 。
根 据 操 作 数 的 位 置 , 寻 址 方 式 分 为 立 即 数 寻 址 方 式 、 寄 存 器 寻 址 方 式 、 存 储 器 寻 址 方 式 和 I/ O寻 址 方 式 。
算术运算类指令
加法指令
(1)不带进位加法指令ADD(4条)
ADD A,Rn ;(A)+(Rn)→A,n = 0~7
ADD A,direct ;(A)+ (direct)→A
ADD A,@Ri ;(A)+((Ri))→A,i = 0,1
ADD A,#data ;(A)+#data→A
(2)带进位加法指令
ADDC A,Rn ;(A)+(Rn)+Cy→A,n = 0~7
ADDC A,direct ;(A)+(direct)+Cy→A
ADDC A,@Ri ;(A)+((Ri))+Cy→A,i = 0,1
ADDC A,#data ;(A)+#data+Cy→A
(3)加1指令(5条)
INC A
INC Rn ;n = 0~7
INC direct
INC @Ri ;i = 0,1
INC DPTR
(4)十进制调整指令(1条)
```
DA A ;调整A的内容为正确的BCD码
```
减法指令
减法指令包括带借位减法指令和减1指令两类
(1)带借位减法指令(4条)
SUBB A,Rn ; (A) - (Rn) - Cy→A,n = 0~7
SUBB A,direct ; (A) - (direct) - Cy→A
SUBB A,@Ri ; (A) - ((Ri)) - Cy→A,i = 0,1
SUBB A,#data ; (A) - #data - Cy→A
(2)减1指令(4条)
DEC A ;(A) - 1→A
DEC Rn ;(Rn) - 1→Rn,n = 0~7
DEC direct ;(direct) - 1→direct
DEC @Ri ;((Ri)) - 1→(Ri),i = 0,1
####乘除运算指令
(1)乘法指令(1条)MUL AB ;A×B→BA
(2)除法指令(1条)DIV AB ;A÷B,商→A,余数→B
逻辑运算与移位指令
逻辑与指令
ANL A,Rn ;(A)∧(Rn)→A,n = 0~7
ANL A,direct ;(A)∧(direct)→A
ANL A,#data ;(A)∧#data→A
ANL A,@Ri ;(A)∧((Ri))→A,i = 0~1
ANL direct,A ;(direct)∧(A)→direct
ANL direct,#data ;(direct)∧#data→direct
逻辑或指令
ORL A,Rn ;(A)∨(Rn)→A,n = 0~7
ORL A,direct ;(A)∨(direct)→A
ORL A,#data ;(A)∨ #data→A
ORL A,@Ri ;(A)∨((Ri))→A,i = 0,1
ORL direct,A ;(direct)∨(A)→direct
ORL direct,#data ;(direct)∨#data→dire
逻辑异或指令
XRL A,Rn ;(A) (Rn)→A,n = 0~7
XRL A,direct ;(A) (direct)→A
XRL A,@Ri ;(A) ((Ri))→A,i = 0,1
XRL A,#data ;(A) #data→A
XRL direct,A ;(direct) (A)→direct
XRL direct,#data ;(direct) #data →direct
累加器“清零”及“取反”指令
(1)CLR A
这条指令的功能是:将累加器A清“0”,不影响Cy、Ac和OV等标志。
(2)CPL A
这条指令的功能是:将累加器A按位取反,不影响Cy、Ac和OV等标志。
####移位指令
- 左环移指令
RL A
- 带进位左环移指令
RLC A
- 右环移指令
RR A
- 带进位右环移指令
RRC A
- 累加器半字节交换指令
SWAP A
###控制转移类指令
无条件转移指令
长转移指令 LJMP addr16 ;addr16 → PC
短转移指令 AJMP addr11 ;(PC)+ 2→PC,addr11→PC10~0, PC15~11不变
相对转移指令 SJMP rel ;(PC)+2→PC,(PC)+ rel→PC
间接跳转指令(散转移指令)JMP @A+DPTR ;(PC)+1→PC,(A)+(DPTR)→PC
条件转移指令
(1)累加器A判零条件转移指令
JZ rel ;若(A) = 0,则PC+2+rel→PC
;否则,PC+2→PC
JNZ rel ;若(A) ≠ 0,则PC+2+rel→PC
;否则,PC+2→PC
(2)比较条件转移指令
CJNE A,direct,rel ;若(A) ≠ (direct),则PC+3+rel→PC
;否则,PC+3→PC
CJNE A,#data,rel ;若(A) ≠ data,则PC+3+rel→PC
;否则,PC+3→PC
CJNE Rn,#data,rel ;若(Rn) ≠ data,则PC+3+rel→ PC
;否则,PC+3→PC
CJNE @Ri,#data,rel ;若((Ri)) ≠ data,则PC+3+rel→PC
;否则,PC+3→PC
(3)减1条件转移指令
DJNZ Rn,rel ;(Rn)-1→Rn
;若(Rn) ≠ 0,则PC+2+rel→PC
;否则,PC+2→PC
DJNZ direct,rel ;(direct)-1→direct
;若(direct) ≠ 0,则PC+3+rel→PC
;否则,PC+3→PC
子程序调用及返回指令
① 长调用指令
LCALL addr16 ;(PC)+3→PC
;(SP)+1→SP,PC7~0→(SP)
;(SP)+1→SP,PC15~8→(SP)
;addrl6→PC
② 绝对调用指令
ACALL addr11 ;(PC)+2→PC
;(SP)+1→SP,PC7~0→(SP)
;(SP)+1→SP,PC15~8→(SP)
;addr11→PC10~0,PC15~11不变
RET ;((SP))→PC15~8,(SP)-1→SP
;((SP))→PC7~0,(SP)-1→SP
中断返回指令
RETI ;((SP))→PC15~8,(SP)-1→SP
;((SP))→PC7~0,(SP)-1→SP
###空操作指令NOP ;(PC)+1→PC
位操作类指令
-
位传送指令(2条)
MOV C,bit ;(bit)→Cy
MOV bit,C ;Cy→(bit) -
位置位/复位指令(4条)
CLR C ;0→Cy
CLR bit ;0→bit
SETB C ;1→Cy
SETB bit ;1→bit -
位运算指令
ANL C,bit ;(Cy) ∧ (bit) → Cy
ANL C,/bit ;(Cy) ∧
ORL C,bit ;(Cy) ∨ (bit) → Cy
ORL C,/bit ;(Cy) ∨
-
位条件转移指令
JC rel ;若Cy = 1,则(PC)+2+re→PC
;否则,(PC)+2→PC
JNC rel ;若Cy = 0,则(PC)+2+re→PC
;否则,(PC)+2→PC
JB bit,rel ;若(bit) = l,则(PC)+3+re→PC
;否则,(PC)+3→PC
JNB bit,rel ;若(bit) = 0,则(PC)+3+re→PC
;否则,(PC)+3→PC
JBC bit,rel ;若(bit) = 1,则(PC)+3+re→PC,0→bit
;否则,(PC)+3→PC