一、前言

        本片文章是基于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汇编虽然作为一个不常用的编程语言而且用起来比较繁琐,但是在一些特殊地方还是有用处的。本文内容简单但是有助于学生记忆或者相关工作人员查询。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐