指令系统概述
指令
指令:CPU按照人们的意图来完成某种操作的命令。
汇编语言指令:用助记符、符号地址、标号等表示的书写程序的语言。
8051指令系统在分类上属于复杂指令集,简明、易掌握、效率较高。以8051为内核的单片机都需要使用8051的指令系统,如Atmel的89S51/89S52等。
指令格式
指令格式:指令的表示方法。
指令由两部分组成,操作码和操作数。按照不同的指令长度,指令的格式会不相同
单字节指令:操作码和操作数同在一个字节中。
双字节指令:一个字节为操作码,另一个字节是操作数。
三字节指令:操作码占一个字节,操作数占二个字节。
指令系统的寻址方式
寻址方式 在指令中说明操作数所在地址的方法。
8051共有7种寻址方式。
1. 寄存器寻址方式
指令中的操作数为某一寄存器的内容。
MOV A,Rn ;(Rn) -> A, n 0~7
将Rn中的源操作数送入累加器A中。
操作数送入到累加器A中。由于指令指定了从寄存器Rn中取得源操作数。
2. 直接寻址方式
指令中的给出操作数的目标地址,直接从目标地址中读取操作数
MOV A,direct ;direct就是操作数的单元地址
MOV A, 40H ;从40H读数据传给A
MOV 42H,46H 将片内RAM中的46H传给42H
直接寻址是访问片内所有特殊功能寄存器的唯一寻址方式!!!
3. 寄存器间接寻址方式
不同于寄存器寻址的地方是,寄存器寻址是在寄存器中直接存放操作数,而寄存器间接寻址是在寄存器中存放操作数地址。为了区别,寄存器间接寻址应在寄存器名称钱加上前缀标志**“@”**
MOV A @Ri ;i = 0或1
MOV A @40H
4. 立即数寻址方式
直接在指令中给出操作数(也称作立即数)。为了与直接寻址区别开,需要加前缀标志**“#”**
MOV A,#40H
5. 基址寄存器加变址寄存器间接寻址方式
以DPTR或PC作为**基址寄存器,以累加器A作为变址寄存器**。以两者内容相加形成的16位地址作为目的地址进行寻址
MOVC A @A+DPTR
若(A) = 05H,(DPTR) = 0400H,指令执行结果是把存储器0405H单元的内容传送给A
本寻址方式方式的指令仅有3条:
MOVC A,@A+DPTR
MOVC A,@A+PC
JMP A,@A+DPTR
前两条主要用于读程序存储器中的数据,遍历列表等
最后一条可以实现跳向不同程序入口
6. 相对寻址方式
主要用于解决程序转移。该寻址是以该转移指令的地址PC值加上它的字节数,再加上相对偏移量rel形成新的转移目的地址,从而使得程序转移到该目的地址。
计算方式:
目的地址=转移指令所在的地址+转移指令字节数+rel
rel应当用补码表示,可正可负
SJMP rel
本程序要转移到该指令的PC值加3再加上rel的目的地址处。
SJMP LOOP
LOOP为目的地址标号,由汇编程序自动计算和填入偏移量
7. 位寻址方式
对内部RAM和特殊功能寄存器具有位寻址功能的末尾内容置1或清0
MOV C,bit ;例如 MOV C,40H
把为地址40H的值送到进位位C
总结一下
序号 | 寻址方式 | 寻址空间 及主要功能 | 标记符号 | 是否可以访问sfr |
---|---|---|---|---|
1 | 寄存器寻址 | R0~R7,A,B,DPTR等 | 无 | 否 |
2 | 直接寻址 | 内部128字节RAM,sfr | 无 | 是 |
3 | 寄存器间接寻址 | 片内、片外数据存储器 | @ | 否 |
4 | 立即数寻址 | 程序存储器中的立即数 | # | 否 |
5 | 基址寄存器加变址寄存器间接寻址 | 程序存储器中的固定数据与程序散转 | @ | 否 |
6 | 相对寻址 | 程序相对跳转 | 无 | 否 |
7 | 位寻址 | 内部RAM与sfr中的可寻址位 | 无 | 仅可访问特殊的位 |
8051常见指令
首先,介绍一下指令会用到的符号。
Rn 当前寄存器区的8个工作寄存器R0~R7
Ri 当前寄存器区中作为间接寻址寄存器的2个寄存器R0、R1
direct 直接地址,即8位内部数据存储器单元或sfr的地址
#data 指令中的8位立即数
#data16 指令中的16位立即数’
rel 8位有符号数的偏移量
DPIR 数据指针
bit 可直接寻址的一位
C 或 Cy 进位标志位或微处理机的累加器
addr11 11位目的地址
addr16 16位目的地址
@ 间接寻址寄存器的前缀
(x) 表示x地址单元或寄存器中的内容
数据传送指令
- 普通传送指令
MOV <目的操作数>,<源操作数>
将源操作数复制到源操作数去,本指令不影响标志位(除奇偶标志位)。
特别注意:
~ MOV指令经常用于往累加器A里面传送数据,以实现相应的计算功能等。
~ MOV指令还经常用于将16位立即数送入DPTR。AT89S52有两个DPTR,通过设置AUXR1中的DPS位来选择,当DPS = 1,指令中的DPTR即为DPTR1,反之亦然。DPTR因其为16为数据指针而更加灵活。
~ - 堆栈操作指令
堆栈:FIFO,堆栈指针SP用于指示堆栈的栈顶位置。出栈指令: POP direct ;sp-1```
- 累加器A与外部数据存储器RAM/IO传送指令
MOVX A, @DPTR/@Ri
- 查表指令
此两指令均为查询程序存储器。而程序存储器只读不写,因此传送为单向,仅可从程序存储器中读出数据到A中。
MOVC A, @A+PC 不必变更sfr和PC的状态,根据A的内容直接取出常数,但是表格只能存放在该指令所在地址+256个单元之内
MOVC A, @A+DPTR 可以任意寻址
执行以上指令时,单片机的PSEN*引脚信号有效。
算术运算指令
所有的算术运算指令均为针对8进制无符号数的,其余类型的运算必须自行设计程序
- 加法
- ADD
必须有一个加数来自于A,结果存放在A中
进位标志Cy,辅助进位标志Ac,溢出标志位OV,奇偶校验位P
注意:只有有符号数加法运算OV才有意义,OV在位6和位7有且仅有一个有进位时才会置1. - ADDC
在加的过程中,Cy也会被加入 - INC
自增指令 +1;
不会影响标志位
- ADD
- 减法
- SUB
Cy,Ac,OV同理,必须有一个数字来自于A,结果存放在A中 - SUBB
减法时,需要考虑上Cy - DEC
自减指令 -1 不影响标志位(P标志位除外)
- SUB
- 乘法指令
MUL AB
表示A X B 乘积的低字节在A中,高字节在B中 - 除法指令
DIV AB
表示A/B 商存放在A中,余数存放在B中
逻辑操作指令
- CLR 清0指令 不影响标志位
- CPL 按位取反指令 不影响标志位
- RL 左环移
- RR 右环移
- RLC 带进位左环移
- RRC 带进位右环移
7. ANL 逻辑与
8. ORL 逻辑或
9. XRL 逻辑异或
控制跳转指令
- 长转移指令 LJMP addr16
- 相对转移指令 SJMP rel (也就是常用的在程序中LOOP:的写法)
- 绝对转移指令:AJMP addr11
- 间接跳转指令 JMP @A+DPTR
以DPTR内容为基址,A的内容为变址.实现多分支转移. - 条件转移指令 JZ JNZ
- 比较不相等转移指令 CJNE
如果第一个数小于第二个数,则进位标志位Cy置1,否则清0 - 减1不为0转移指令 DJNZ
- 调用子程序指令 LCALL ACALL
- 子程序返回指令 RET
- 中断返回指令 RETI
- 空操作指令 NOP
位操作指令
- 数据位传送指令 MOV C,bit
- 位变量修改指令 CLR清0;CPL求反;SETB置1
- 位变量逻辑与 ANL
- 位变量逻辑或 ORL
- 条件转移类指令 JC JNC(进位标志位Cy);JB JNB(直接寻址位); JBC(直接寻址位为1时转移,并把寻址位清0)
对指令的说明
- 在读IO口之前,必须要先对引脚写1;“MOV C P1.0”
- 在读锁存器时,需要用读—修改—写指令,他会先读P1.0锁存器的Q端状态,接着取反,然后送到P1.0上.
- 如果不知道指令中的地址是字节地址还是位地址,只需要看目的操作数就行,两者是相同的
- A与Acc
汇编语言程序概述
“汇编”:汇编语言源程序需转换(翻译)成为二进制代码表示的机器语言程序,才能识别和执行。
优点:用汇编语言编写程序效率高,占用存储空间小,运行速度快,能编写出最优化的程序,
缺点:可读性差,离不开具体的硬件,是面向“硬件”的语言通用性差
"高级语言":
优点:通用性强,直观、易懂、易学,可读性好。
缺点: 对时间和空间占用高
下文将讨论汇编语言编写程序的方式