MCS-51单片机汇编指令总结
本片文章是基于MCS-51单片机的汇编指令集进行的指令总结,讲解内容少,记忆内容多,方便查询使用,也可以应对考试内容记忆。包括数据转移指令,数学运算指令,逻辑指令,位指令,跳转指令等。另外还包括定时器的使用。
一、前言
本片文章是基于MCS-51单片机的汇编指令集进行的指令总结,讲解内容少,记忆内容多,方便查询使用,也可以应对考试内容记忆😀包括数据转移指令,数学运算指令,逻辑指令,位指令,跳转指令等。另外还包括定时器的使用。
二、背景知识
这点是为了方便理解下面的指令进行的知识储备。
1.MCS-51存储结构
MCS-51存储结构分为片内存储和片外存储,如下图所示。
ROM分为片内和片外ROM,可以统一编址,用于存放程序和烧录之前就定义的数据。RAM也分为片内RAM和片外RAM,虽然是统一编址,但是可以根据指令不同选择不同的RAM,用于存放临时数据。
2.汇编符号
Ri:寄存器R1或者R0,R1R0可用于存放片内RAM地址。
Rn:寄存器R0-R7,可用于存放数据。
#data:立即数。
XXH:地址,如35H。只限片内RAM使用,片外必须用转换地址符。
A:加法寄存器。
DPTR:十六位地址寄存器,常用于放置外部64KB RAM寄存器地址
@:转换地址符,类似于C语言中(int *)
C:进位标志位,也可以看作位操作寄存器,也叫CY
3.六种操作数
分别为A,XXH,@Ri,Rn,#data,DPTR,其中除了立即数,剩下五种可看作等同于C语言中的变量。
三、数据转移指令
1.片内RAM数据传送指令
MOV A,#data / 35H / RN / @Ri
MOV Rn,#data / 35H / A (工作寄存器之间不能直接传送)
MOV @RI,#DATA / 35H / A (工作寄存器之间不能直接传送)
MOV 35H,#DATA / A /36H / Rn / @Ri
MOV DPTR,#1352H
MCS-51指令只用于片内编址。
2.片外RAM数据传送
MOVX A,@Ri/@DPTR
MOVX @Ri/@DPTR,A (必须有A的参与)
3.ROM数据传送
MOVC A,@A+DPTR (A为偏移量,DPTR为表首地址)
MOVC A,@A+PC (A为相对下一条指令的偏移量,PC为下一条指令地址)
4.数据交换指令(只能片内RAM)
XCH A,Rn/@Ri/35H (A必须参与运算)
XCHD A,@Ri (只换低四位) (exchange down)
四、数学运算指令
1.加法
ADD A, (除了DPTR的其他四种变量)
ADDC A,(同上)
2.自加
INC(五种都可) (只要对A操作就会影响PSW)
3.减法
SUBB A,(除了DPTR的其他四种变量) (使用前如果不考虑CY用CLR C)
4.自减
DEC (除了DPTR的其他四种变量)
5.十进制运算
DA A(只能是A,为十进制调整指令,紧跟ADD或ADC,只能用来BCD加法运算,如果减法需要人为求十进制的补码)
6.乘除法
MUL AB (被乘为A,低位给A,高位给B)(multiply)
DIV AB (被除为A,商给A,余给B)(division)
五、逻辑运算
1.与逻辑
ANL A,除DPTR其他四种
ANL 35H,#35H/A (与指令与其他运算指令不同的是可以目的操作数是地址,但源操作数只能是立即数或A)
2.或逻辑
ORL A,同上
ORL 36H,同上
3.异或
XRL A,同上
XRL 37H,同上 (异或,与1异或相当于某些位取反用)
4.清零或取反
CLR A/C/P/某个位
CPL A (整体取反)
六、位操作
1.循环移位
RL A (round left)
RR A (round right)
RLC A (round left +cy)
RRC A (round right+cy)
SWAP A (swap交换的意思,高四位和低四位交换)
2.位数据传送
MOV C,20H
MOV 20H,C (当其中一个操作数为位时,则地址就是位存储区)
3.位清除和置一
CLR C/bit
SETB C/bit
4.位逻辑
ANL C,bit
ANL C,/bit (此处斜杠是非的意思,值取反但不改变原来的值,bit是位地址的意思)
ORL 同上
七、跳转指令
1.长跳转64KB
LJMP START(常用在ROM 0000H地址跳转到程序地址)
2.相对跳转 2KB
AJMP addr11(AJMP用于在与下一条指令同2KB区域跳转,因为十一位地址)
3.短跳转
SJMP rel (说是rel是偏移量,其实后面直接跟地址即可,汇编转exe会自己计算偏移量,偏移量是目标地址减去该地址再减2)
4.间接跳转
JMP @A+DPTR A为偏移量,DPTR为目标程序段首地址,将目标程序段首地址放入DPTR时,将地址符号前加上#,如 MOV DPTR,#TAB
5.条件跳转
JZ 目标地址(为1跳)
JNZ 目标地址(判断A是否为0,一个是为1跳,一个是不为1跳)
JC 目标地址
JNC 目标地址 (判断CY是否为零,同上)
JB bit,rel
JNB bit,rel
JBC bit,rel (C时clear意思,跳转后bit清零,rel还是直接目标地址
CJNE A,35H/#DATA,目标地址
CJNE RN/@RI,#DATA,目标地址 (如果是工作寄存器,后面只能比较立即数)(CJNE实质是减法指令,然后可以通过检查CY判断大小,CY为1则是说明有借位,目的操作数小于源操作数,CY为0无借位,则大于)
相当于C语言中的if作用。
6.循环跳转指令
DJNZ Rn,目标地址 (Rn存放循环次数)
类似于C语言中的for(i=0;i<n;i++),但是DJNZ是不会返回到程序段开头,原理是执行这条指令DJNZ所指寄存器-1,所以执行完目标程序段需要用SJMP返回到DJNZ上。
7.子函数跳转
LCALL addr16
ACALL addr11 (调用子函数指令)
RET (跟在普通子函数)
RETI(跟在中断程序)
(return)
(两个都是返回程序)
八、空指令
NOP (空操作指令,执行一个机器周期,用作短延时,长延时用定时器中断),相当于C语言中常见的delayus()。
九、伪指令
ORG 2000H(用于确定程序块的首地址)
END (结束伪指令,只能有一个)
TAB(这是字符名) EQU 0220H/R0 (EQU相当于define,一般用于地址或者寄存器的另一个定义)
M DATA 20H (DATA一般用于8位或16位地址或数据,不能定义汇编符号)
TAB1:DB 30H,8AH,7FH
TAB2:DW 1238H,25H(DB和DW是相当于char和int,对于DW,低地址放高位,高地址放低位)(若DW后面是八位,则默认高八位为00H)(该数据存放在ROM中,和程序在一个位置)
TAB1:DS 20H
DB 30H,12H (DS后面的数字是内存单元占据数目,所以DB则是在20个单元后再存放30H和12H)
K1 BIT 20H
Y BIT P1.0(BIT是相当于位地址赋值指令,用K1和Y代替20H和P1.0)
十、MCS-51定时器和中断简述
1.中断和中断自然优先级
8051有五个中断,标志分别是IE0,TF0,IE1,TF1,TI,RI(TI,RI是一个),中断允许再IE寄存器,第一位位EA,总中断。隔两位之后分别为ES,ET1,EX1,ET0,EX0.固有优先级是先外部后定时器,先0后1,串口最后。
2.中断寄存器
中断设计四个寄存器,首先是IE(interrupt enable)中断允许寄存器,包含了如上述允许标志位,可以位操作。IP(interrupt piority)中断优先寄存器,8051优先级为两层,IP中对应置一为高级,0是低级,从低到高为PX0,PT0,PX1,PT1,PS,可以位操作。
之后是TCON和SCON两个寄存器,分别是控制定时器和控制串口的寄存器,可以进行位操作。同时也是控制定时器和串口相关参数的寄存器。
TCON按优先级从低到高排,分别是IT0(设置外部中断触发方式,0是电平触发,1是负边沿触发),IE0,IT1,IE1.TR0(1位定时器0启动,0位定时器0停止),TF0,TR1,TF1.
SCON只有两个标志位,从低往高位RI和TI。所有中断都是1是有中断,0是无中断。(注意处理中断有终端法和查询法,中断法是需要在IE寄存器上允许中断,然后CPU跳转中断程序,查询法是不断的用循环查询对应标志位,不需要允许中断。)
以上提到的所有位都可以通过CLR和SETB来进行位操作。
3.中断标志的清除
中断请求清除时,需要清楚标志位,对于定时器会自动清除,对于串口,需要再中断程序中手动清楚。
对于外部中断,使通过硬件触发的,即对引脚电平进行更改,控制外部电路让中断引脚改变。负边沿时CPU自行清除,电平触发需要认为程序处理。
4.定时器配置
8051两个定时器都有四种工作方式,用TMOD寄存器来设置,注意TMOD无法位操作。
工作方式0是十三位计数器,低五位和高八位,即THi全用,TLi,用第五位。工作方式1是16位。
工作方式二是8位自动重装定时器,THi即低八位计数,高八位存储即THi放置需要重装的数。
工作方式三就是将T0拆为两个定时器,TH0当作T1使用,可以使用T1的TF1和TR1。
TMOD寄存器是设置定时器运作方式。低四位是T0高四位是T1,四位从高到低为GATE(门控工作方式,0是正常定时和计数,1为门控方式),C/T(控制位计数工作count还是定时器工作time),0是定时,1是计数。后两位是M1,M0,两位四种状态对于方式0-3。
记住2^16为65536,2^13为8192,2^8为256,根据需要选择。
记住地址0003H是外部中断0程序地址,000BH是T0,0013H是外部1,001BH是T1,0023H是串口。
十一、后言
本文为作者的一些拙见,如有错误或者缺漏请评论指出,感激不尽/(ㄒoㄒ)/~~。51汇编虽然作为一个不常用的编程语言而且用起来比较繁琐,但是在一些特殊地方还是有用处的。本文内容简单但是有助于学生记忆或者相关工作人员查询。
更多推荐
所有评论(0)