这一篇文章我们主要涉及到8051单片机指令系统的寻址方式以及8051的汇编指令
1,8051单片机指令的寻址方式
(1)寄存器寻址:
以通用寄存器的内容为操作数的寻址方式。
通用寄存器为Rn(n=0~7)以及A,B,DPTR。在8051单片机中,没有专门的通用硬件寄存器,而是把内部数据RAM区中的通用寄存器R0~R7作为工作寄存器使用,共有32的单元,分为4组,每组8个工作寄存器,每次只使用其中之一,当以R0~R7来表示操作数时,就属于是寄存器寻址方式。
注意:寄存器寻址只能使用R0~R7,而且不支持Rn之间的传送
CLR A ;A←0
INC DPTR ;DPTR←DPTR+1
ADD R7,# 50H ;R7←#50H+R7
MOV A, R0 ;A←R0
错误示范:
MOV R0, R1 ;R0←R1 //这是错误的,Rn之间不能进行传送
(2)寄存器间接寻址:
以寄存器中内容为地址,以该地址中内容为操作数的寻址方式。间接寻址的存储器空间包括内部数据RAM和外部数据RAM,能用于寄存器间接寻址的寄存器有R0,R1和DPTR,在寄存器名称前面加 一个符号@来表示寄存器间接寻址。
注意:只有R1,R0,DPTR这三个能用作间址寄存器,且间址寄存器要加上符号@
MOV A, @R0 ;A←((R0))
MOVX @DPTR, A ;((DPTR))←A
(3)直接寻址方式:
直接给出操作数地址,8051单片机中,用直接寻址方式可以访问片内数据RAM中DATA空间的00H~7FH共128个单字节及所有的特殊功能寄存器。
注意:直接寻址方式只能访问内部RAM单元,也是访问专用寄存器(特殊功能寄存器)的唯一方法。
8051累加器可采用2中方法:
目标操作数使用A时,则是寄存器寻址方式。
目标操作数使用ACC时,则是直接寻址方式
示例:
MOV A, 40H ;A←40H
(4)立即数寻址方式:
若指令的操作数是一个8位或16位二进制数,就称是立即寻址,指令中的操作数称为立即操作数。在立即数前以“#”标识。
MOV A, #40H ;A←40H;将40H的内容传送到累加器A中
MOV DPTR, #data16 ;DPTR←data16;将打他16的内容传送到DPTR中
(5)变址寻址:
变址寻址是以DPTR或PC的内容为基本地址,然后加上基址上A的内容作为地址偏移量,是专门针对或用于程序存储器的寻址方式ROM都是1byte指令。
变址寻址的条件
1:需要一个变址寄存器(累加器A)来保存地址偏移量
2:需要一个基址寄存器来保存基址地址(DPTR,PC)
把1和2相加作为操作数的地址;变址寻址的指令只有3条:都是1byte指令
MOVC A, @A+DPTR ;A←@A+DPTR
MOVC A, @A+PC ;A←@A+PC
JMP @A+DPTR ;
(6)位寻址:
(对单独的位进行操作)位寻址只能对有位地址的单元作位寻址操作。位寻址其实是一种直接寻址方式,不过其地址是位地址。8051cpu再执行指令时是1位位宽的cpu。一次只能处理1位二进制数,字节寻址能处理8bit二进制数,8051中只有极少数指令是16bit寻址的二进制数。
SETB 20H ;将20H位置1
MOV 40H,C ;40H←进位位CY
CLR PSW.4 ;将PSW.4位清0
(7)相对寻址:
前面讲述的6种寻址方式都主要用来解决操作数给出的问题,而这里的相对寻址方式则是为解决程序转移设置的(只能用作转移指令)
目标地址=转移指令地址+转移指令字节数+地址偏移量rel
SJMP 08H ;PC←PC+08H+2
2,8051的汇编指令
8051共有111条汇编指令:可分为5类
1,数据传送类指令(29条):
MOV (内部RAM读/写指令)16条
MOVX(外部RAM读/写指令,X代表的是外部)4条
MOVC(程序存储器读指令,C代表的是代码,程序,code的首字母)2条
数据交换类指令:
XCH (整个字节交换指令)3条
XCHD(半字节交换指令;只交换低4位,高4位保持不变)1条
SWAP A (累加器A高低半字节交换指令)
堆栈操作指令:
PUSH (进栈)
POP (出栈)
2,算术运算类指令24条
都是按8bit无符号数进行的,会影响相关标志位CY,OV
ADD (不带进位的加法指令;2个无符号8bit数相加)4条
ADDC (带进位的加法指令)4条
SUBB (带借位减法指令)4条
INC (加1/递增指令)5条
DEC (减 1/递减指令)4条
MUL (乘法指令)1条
DIV (除法指令)1条
DA(十进制调整指令/加6修正指令;超过9就加6)1条
3,逻辑运算及移位指令24条:
ANL (逻辑“与”)6条
ORL (逻辑“或”)6条
XRL (逻辑“异或”)6条
CLR 0 (累加器清0)1条
CPL A (累加器取反)1条
移位指令:
RL (循环左移)1条
RR (循环右移)1条
RLC (通过cy循环左移)1条
RRC (通过cy循环右移)1条
4,控制转移类指令:17条
无条件转移指令:
LJMP (无条件长转移)64KB
AJMP (无条件绝对转移)2KB
SJMP (无条件短转移)256byte
JMP (无条件间接转移)64KB
条件转移指令:
JZ (累加器判0);A=0程序跳转,A不等于0执行下一条指令
JNZ (累加器判非0转移)A=0执行下一条指令;A不等于0程序跳转
CJNE (数值比较)4条
DJNZ (减1条件转移指令)2条
子程序调用返回指令:
ACALL (绝对调用)
LCALL (长调用)
RET (子程序返回)
RETI (中断服务子程序返回)
NOP (空操作,用于延时)
5,位操作类指令17条:
MOV (位传送)2条
SETB C(CY置1)
SETB bit(指定位置1)
CLR C (cy清0)
CLP bit(指定位清0)
位逻辑运算指令6条:
ANL C (指定位与cy逻辑“与”)
ORL C (指定位与cy逻辑“或”)
CPL C (CY取反)
CPL bit(指定位取反)
位控制转移类指令:
以CY状态为条件
JC rel (CY=1转移)
JNC rel (CY=0转移)
以位状态为条件:
JB bit, rel(指定位状态为1转移)
JNB bit, rel(指定位状态为0转移)
JBC bit, rel(指定位状态为1转移,并使该位清0)
297

被折叠的 条评论
为什么被折叠?



