8051指令系统及汇编语言设计(1-3)

这一篇文章我们主要涉及到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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值