51单片机:8051指令简介
专业课本上包含的指令会比较全面,而在我的这篇博文中不会写的那么全。我只是简单的介绍一些常见的指令,这些指令是我考试内容中必须要掌握的,是我对知识点的一个简单梳理。在开始之前先介绍一些必要的符号意义,这样不至于在指令中看到太过于突兀。
- Rn 当前寄存器区的寄存器,n的取值可以是0到7,即R0~R7。
- Ri 当前寄存器区中可以用来间接寻址的寄存器,i的取值为0,1,即R0,R1。
- direct 直接地址
- #data 8位立即数
- #data16 16位立即数
- DPTR 数据指针
- @ 间接寻址寄存器的前缀
- (X) X地址单元的或者寄存器中的内容
- ((X)) 以X地址单元的或者寄存器中的内容为地址的间接寻址位置的内容
数据传送指令:
传送指令中常用的有MOV,堆栈PUSH\POP操作,累加器与外部数据的传送、查表指令、字节交换。
MOV:
MOV的操作比较好记,也便于理解。根据英语单词move(移动,改变),我们可以知道MOV的作用就是把内容进行转移,至于转移的内容可以是具体的内容,也可以是一个地址,间接实现转移内容。其实不难发现,很多指令根据一些单词很容易记住其作用的,另外汇编语言大小写都可以,根据个人习惯。下面对MOV进行简单介绍:
MOV <目的操作数>,<源操作数>
累加器为目的操作数的指令:
MOV A ,Rn ; (Rn) ——>A,把Rn中的内容传给A,寄存器寻址方式
MOV A,@Ri ; ((Ri))——>A,间接寻址方式
MOV A,direct; (direct)——>A,直接寻址方式
例如:MOV A,70H; (70H)——>A ,A中存入地址为70H中的内容
MOV A,#direct; #direct——>A,立即数寻址方式
例如:MOV A,#70H; 70H——>A ,A中的内容为70H
这些指令的目的是把源操作数的内容送到累加器A中,以上四个指令还分别对应着寄存器寻址方式、间接寻址方式、直接寻址方式、立即数寻址方式。
寄存器间接地址为目的操作数的指令
MOV @Ri,A ;(A)——>((Ri))
MOV @Ri,direct ;(direct)——>((Ri))
MOV @Ri,#direct ;#direct——>((Ri))
堆栈操作:
PUSH(进栈指令),首先将栈指针SP加1,然后把内容送到SP所指的地址中
例如:
当(SP)= 60H,(A)= 30H,(B)= 70H,执行下面指令:
PUSH Acc ;(SP) + 1 = 61H ,(A) ——> 61H
PUSH B ;(SP) + 1 = 62H ,(B) ——> 62H
结果:
(61H)= 30H,(62H)= 70H, (SP) = 62H
POP(出栈指令),首先将内容送到SP所指的地址中,然后栈指针SP减1
例如:
当(SP)= 62H,(62H)= 70H,(61H)= 30H时,
执行下面指令:
POP DPH ; ((SP)) = DPH ,SP-1——>SP,DPH=70H
POP DPL ; ((SP)) = DPL ,SP-1——>SP,DPL=30H
结果:
(DPTR)= 7030,(SP) = 60H
累加器A与外部数据存储器传送指令:
MOVX A,@DPTR ;((DPTR))——>A,读取外部存储器中的数据
MOVX @DPTR,A ; (A)——>((DPTR)),把内部数据写入外部
这个地方主要注意区分一下MOV与MOVX,例子的话可以看数据传送片内到片外或者数据传送片外到片内。
查表指令:
这类指令有两条,均是采用基址寄存器加变址寄存器间接寻址方式
- MOVC A,@A + PC.指令以PC作为基址寄存器,A中内容与PC中内容相加得到一个新的地址,再把该地址送入A中。
例如:
当(A) = 30H时,执行1000H处指令
1000H:MOVC A,@A + PC
结果:
把1031H单元的中的内容送入A中,也许会有个疑问,为什么不是1030H单元中的内容送入A中,这是因为这条指令的本身就占了一个单元格,下一条指令的起始地址为1001H,即(PC)= 1001H。
- MOVC A,@A + DPTR,该指令以DPTR为基址寄存器。还是以栗子来看怎么运行的:
(DPTR) = 8100H,(A) = 40H,执行指令
MOVC A,@A + DPTR
结果:
把8140H单元内容送入A中。
字节交换指令:
XCH A,Rn;(A)<——>(Rn);
顾名思义,就是把两个不同单元中内容进行交换,完全互换。区别于XCHD A,Rn(半字节交换指令,只进行A中低四位与Rn中高四位互换)。
算术类指令:
加法
ADD A ,B; (A) = (A) + (B) 。
INC A ; 自加1,然后送入A中。
减法
DEC A ; 自减1,然后送入A中。
乘法
MUL AB ; BA = A*B;
除法
DIV AB; A = A/B(商),B = A/B(余数);
逻辑类
ANL : 与逻辑,全1为1,其余为0
ORL :或逻辑,全0为0,其余为1
XRL : 异或逻辑,不同为1,相同为0
RL : 左循环
RR :右循环
跳转类
JNB:内容为0,转移
JB:内容为1,转移
DJNZ:内容减1,不为0转移
CJNZ:比较结果不相等,转移
(参考书籍《单片机原理及应用》)