叁:51汇编指令系统

发布者:zdf1966最新更新时间:2019-08-13 来源: eefocus关键字:汇编  指令系统 手机看文章 扫描二维码
随时随地手机看文章

8051单片机共有111条指令,指令按功能进行分类,分为5类:
1、数据传送类指令(28条)
2、算术运算类指令(24条)
3、逻辑运算和移位类指令(25条)
4、位操作类指令(17条)
5、控制转移类指令(17条)

数据传送类指令

数据传送类指令:把源操作数传送到指令锁指定的目标地址

助记符功能使用
MOV访问内部RAM、访问特殊功能寄存器MOV A,Rn ;(Rn)→A,表示将Rn中的内容给A
MOVX访问外部RAMMOVX A,@DPTR ;((DPTR))→A
MOVX @DPTR,A ;(A)→(DPTR)
MOVX A,@Rn ;((Rn))→A
MOVX @Rn,A ;(A)→(Rn)
MOVC访问程序存储器MOVC A,@A+DPTR ;((A)+(DPTR))→A 
MOVC A,@A+PC;((A)+(PC))→A
XCH字节交换XCH A,Rn;(A)→Rn,(Rn)→A 
XCH A,direct;(A)→direct,(direct)→A 
XCH A,@Rn;(A)→(Rn),(Rn)→A
XCHD半字节交换XCHD A,@Rn;高4位不变,低4位交换;
(A)3-0→(Rn)3-0,((Rn))3-0→A 3-0
PUSH入栈操作PUSH direct ;(SP)+1 → SP,(direct)→(SP)
POP出栈操作POP direct ;(direct)→(SP),(SP)+1 → SP

算术运算类指令

算术运算类指令共有24条,包括加、减、乘、除4种基本算术运算指令。算术指令用到的助记符共有8种:ADD、ADDC、INC、SUBB、DEC、DA、MUL、DIV。

1、普通加法指令(ADD)

ADDA,Rn;A←(A)+(Rn) 累加器中数据与寄存器中数据相加送入累加器
ADDA,direct;A←(A)+(direct) 累加器与直接寻址单元中数据相加送入累加器
ADDA,@Ri;A←(A)+((Ri)) 累加器与间接寻址单元中数据相加送入累加器
ADDA,#data;A←(A)+data 累加器中数据直接与立即数相加送入累加器

2、带进位加法指令

ADDCA,Rn;A←(A)+(Rn)+(Cy)
ADDCA,direct;A←(A)+(direct)+(Cy)
ADDCA,@Ri;A←(A)+((Ri))+(Cy)
ADDCA,#data;A←(A)+data+(Cy)

3、加1指令

INCA;A←(A)+1 累加器(A)中数据+1
INCRn;Rn←(Rn)+1 寄存器中数据+1
INCdirect;direct←(direct)+1 直接寻址单元中数据+1
INC@Ri;Ri←((Ri))+1 间接寻址单元中数据+1
INCDPTR;DPTR←(DPTR)+1 数据指针+1

4、带借位减法指令

SUBBA,Rn;A←(A)-(Rn)-(Cy)
SUBBA,direct;A←(A)-(direct)-(Cy)
SUBBA,@Ri;A←(A)-((Ri))-(Cy)
SUBBA,#data;A←(A)-data-(Cy)

5、减1指令

DECA;A←(A)-1 累加器(A)中数据-1
DECRn;Rn←(Rn)-1 寄存器中数据-1
DECdirect;direct←(direct)-1 直接寻址单元中数据-1
DEC@Ri;Ri←((Ri))-1 间接寻址单元中数据-1

6、乘法指令

MULAB;(A)×(B)→ BA

7、除法指令

DIVAB;(A)/(B)→ A(商)B(余数)

逻辑操作类指令

逻辑操作类指令包括:逻辑运算指令和移位类指令。

1、累加器A清零与取反指令

CLRA;对累加器A清“0”
CPLA;对累加器A按位取反

2、逻辑与指令

ANLA,Rn;A←(A)∧(Rn) 累加器与寄存器数据相与送入累加器
ANLA,direct;A←(A)∧(direct) 累加器与直接寻址单元数据相与送入累加器
ANLA,@Ri;A←(A)∧(Ri) 累加器与间接寻址单元数据相与送入累加器
ANLA,#data;A←(A)∧data 累加器与立即数相与送入累加器
ANLdirect,A;direct←(direct)∧(A) 累加器与直接寻址单元数据相与送入直接寻址单元
ANLdirect,#data;direct←(direct)∧data 直接寻址单元内容中数据与立即数相与送入直接寻址单元

3、逻辑或指令

ORLA,Rn;A←(A)∨(Rn) 累加器与寄存器数据相或送入累加器
ORLA,direct;A←(A)∨(direct) 累加器与直接寻址单元数据相或送入累加器
ORLA,@Ri;A←(A)∨(Ri) 累加器与间接寻址单元数据相或送入累加器
ORLA,#data;A←(A)∨data 累加器与立即数相或送入累加器
ORLdirect,A;direct←(direct)∨(A) 累加器与直接寻址单元数据相或送入直接寻址单元
ORLdirect,#data;direct←(direct)∨data 直接寻址单元内容中数据与立即数相或送入直接寻址单元

4、逻辑异或指令

XRLA,Rn;A←(A)⊕(Rn) 累加器与寄存器数据相异或送入累加器
XRLA,direct;A←(A)⊕(direct) 累加器与直接寻址单元数据相异或送入累加器
XRLA,@Ri;A←(A)⊕(Ri) 累加器与间接寻址单元数据相异或送入累加器
XRLA,#data;A←(A)⊕data 累加器与立即数相异或送入累加器
XRLdirect,A;direct←(direct)⊕(A) 累加器与直接寻址单元数据相异或送入直接寻址单元
XRLdirect,#data;direct←(direct)⊕data 直接寻址单元内容中数据与立即数相异或送入直接寻址单元

5、移位类指令

RLA;累加器A的内容向左循环移位1位
RLCA;累加器A的内容带进位标志向左循环移1位
RRA;累加器A的内容向右循环移1位
RRCA;累加器A的内容带进位标志向右循环移1位

循环左移指令示例图:RL A A7←A6←A5←A4←A3←A2←A1←A0 ↓ →---------------------------------------------↑

带进位循环右移指令示例图:RRC A
CY→A7→A6→A5→A4→A3→A2→A1→A0
↑ --------------------------------------------------←↓

位操作类指令

89C51单片机具有丰富的位操作指令,可以完成以位变量为对象的传送、运算、控制转移等操作。
1、位数据传送指令

MOVC,bit;Cy←(bit) 将直接寻址位的内容送入累加器CY中
MOVbti,C;bit→(Cy) 将CY 的内容传送到直接寻址位

注意: 两个可寻址位之间没有直接的传送指令,若要完成这种传送,可通过CY作为媒介间接传送。

例子:若要将30H位的数传送到20H位,则要执行下列指令:
MOV C,30H;
MOV 20H,C;

2、位变量修改指令

CLRbit;bit←0 对位地址清零
CPLC;Cy←(Cy取反) 对位累加器CY取反
CPLbit;bit←(bit取反) 对位地址取反
SETBC;Cy←1 对位累加器CY置1
SETBbit;bit←1 对位地址置1

**3、位变量逻辑指令**

ANLC,bit;Cy←(Cy)∧(bit) 位累加器CY与位地址相与送入位CY中
ORLC,bit;Cy←(Cy)∨(bit) 位累加器CY与位地址相或送入位CY中

控制转移类指令

控制转移类指令的功能主要是控制程序从原来顺序执行地址转移到其他指令地址上。这种转移可以通过程序跳转、调用子程序、子程序返回等途径完成。

1、无条件转移指令
无条件转移指令功能是:当程序执行无条件转移指令时,程序就无条件地转移到该指令所提供的地址上去。

指令说明
JMP rel默认情况下等同于 SJMP rel
SJMP relRel 是8位带符号数,转移范围为当前PC值的-128~+127共256个单元
AJMP addr11addr11 送入PC10~PC0,而PC15~PC11保持不变,转移范围2KB
LJMP addr16addr16 装入PC,转移范围64KB

2、条件转移指令

条件转移指令是依某种特定条件转移的指令。
条件满足时转移到新地址(标号处)。
条件不满足时则按顺序执行下一条指令。

分类指令说明
累加器A 判0转移JZ rel(A) = 0转移 到PC+rel处执行,否则顺序执行
累加器A 判0转移JNZ rel(A) ≠ 0转移 到PC+rel处执行,否则顺序执行
判位(bit)状态转移JB bit,relbit = 1转移到PC+rel处执行,否则顺序执行
判位(bit)状态转移JNB bit,relbit ≠ 1转移到PC+rel处执行,否则顺序执行
判位(bit)状态转移JBC bit,relbit = 1转移到PC+rel处执行,并将该位请0,否则顺序执行
判位(bit)状态转移JC rel进位位CY = 1转移到PC+rel处执行,否则顺序执行
判位(bit)状态转移JNC rel进位位CY ≠ 1转移到PC+rel处执行,否则顺序执行

3、比较转移指令

CJNEA,direct,rel;(A) ≠ (direct)转移
CJNEA,#data,rel;(A) ≠ data转移
CJNERn,#data,rel;(Rn) ≠ data转移
CJNE@Ri,#data,rel;((Ri)) ≠ data转移

4、循环转移指令

DJNZRn,rel;寄存器Rn减1不为0循环转移
DJNZdirect,rel;直接寻址单元direct减1不为0循环转移

指令时间计算

单片机每执行一条指令需要消耗一定的时间才能完成。假定执行一条指令需要时间T,则循环执行N次该指令就需要时间N×T,实际编程中,我们常用DJNZ这条指令实现软件演示的效果。

例:假定一条DJNZ指令需2us,一条MOV指令需1us,执行下面程序后,请问总共需要多长时间?

	  MOV   R7,#200  ;执行1次
DL1: MOV   R6,#250  ;执行200次
DL2:  DJNZ  R6,DL2   ;执行200×250次
      DJNZ  R7,DL1   ;执行200次1234

从上面可推断出,整个程序运行的时间
T = 201×1+200×251×2=100601us=100.601s

子程序调用及返回指令

在程序设计中,通常把具有一定功能的公用程序段编成子程序,当子程序需要使用时调用指令CALL,而在子程序的最后安排一条子程序返回指令RET,以便执行完子程序后能返回主程序继续执行。


1、调用指令CALL
调用指令CALL在发生程序转移前,先将PC的当前值压入堆栈,然后将子程序入口地址送入PC,使CPU转向执行子程序。

指令说明
CALL rel默认情况下等同于 ACALL rel
ACALL addr11addr11 送入PC10~PC0,而PC15~PC11保持不变,转移范围2KB
LCALL addr16addr16 装入PC,转移范围64KB

2、子程序返回指令RET** 子程序返回指令是把栈顶相邻两个单元的内容弹出送到PC,SP的内容减2,程序返回PC值所指的指令处执行。RET指令通常安排在子程序的末尾,使程序能从子程序返回到主程序。


3、中断返回指令RETI** RETI这条返回指令与RET指令完成的功能一样,都是使得子程序返回到主程序中来。但RETI指令比RET指令多做一件事情,就是在主程序返回之前,该条指令还将清除相应的中断标志位,以表示该中断已经响应完成了。 


4、空操作指令NOP** 空操作也是CPU控制指令,它没有使程序转移的功能。只消耗一个机器周期的时间,即此时PC+1。常用于程序的等待或时间的延迟。 ``` ******************************************************************/ * 

【课程4】 ****单片机汇编指令系统的应用*********** * 

【说 明】 ****通过本例程了解单片机的汇编指令系统,并进行程序的编写 * 

【描 述】 ****实现两个立即数FCH和52H相加 ******************************************************************/ ORG 0000H Start: MOV A,#0FCH ;计算FCH+52H=? MOV R0,#52H ADD A,R0 JC L1 ;判断CY,如果CY=1,跳到L1处执行 MOV 30H,#00H JMP L2 L1: MOV 30H,#01H L2: MOV 31H,A

  MOV	A,#0FCH	
  ANL	A,R0	;计算两数相与
  MOV	P0,A
  MOV	A,#0FCH	
  ORL	A,R0	;计算两数相或
  MOV	P1,A
  MOV	A,#0FCH	
  XRL	A,R0	;计算两数异或
  MOV	P2,A
  MOV	A,#0FCH
  CPL	A	;对FCH数取反
  MOV	P3,A
  RL	A	;左移1位
  RL	A	;左移1位
  RL	A	;左移1位
  RL	A	;左移1位
  MOV   P3,A    
  END


关键字:汇编  指令系统 引用地址:叁:51汇编指令系统

上一篇:贰:第一个51单片机的汇编实验
下一篇:肆:IO端口的输出应用

推荐阅读最新更新时间:2024-11-14 17:52

【自学51单片机】3 -- ​硬件基础知识介绍和闪烁LED小灯
1、电磁干扰 电磁干扰简称EMI,包括 ESD(静电放电现象)、EFT(快速瞬间群脉冲效果)、Surge(浪涌效果)等等,ESD、EFT、Surge都是高频信号,对半导体元器件损害较大,在电路设计中要去除电磁干扰影响。 2、电容介绍 1. 电容分类: 铝电解电容、钽电容、陶瓷电容等。 三种电容比较:相同容值下铝电解电容便宜,铝电解电容个头大,钽电容和陶瓷电容个头小,性能好,但贵 。 2. 电容单位:在国际单位制里,电容的单位是法拉,简称法,符号是F,由于法拉这个单位太大,所以常用的电容单位有毫法(mF)、微法(μF)、纳法(nF)和皮法(pF)等,换算关系是:1法拉(F)= 103毫法(mF)=106微法(μF)=10
[单片机]
【自学<font color='red'>51</font>单片机】3 -- ​硬件基础知识介绍和闪烁LED小灯
P89C669 串口C51源程序
#include REG669.H #include STRING.H #include INTRINS.H #include INC\UART.H unsigned char xdata BaudRate = 0; unsigned char xdata Uart0_Counter = 0; unsigned char xdata Uart1_Counter = 0; unsigned char xdata Uart0_Buff ; unsigned char xdata Uart1_Buff ; /************************************************************
[单片机]
基于STC89C51单片机的GPS智能塔钟控制系统的研究
本文研究的GPS自动校时塔钟控制系统是以STC89C51单片机为控制器,由GPS接收器、伺服电机、LED显示、语音报时等部分组成,具有自动校时、显示、报时等功能。通过GPS15XL-W接收芯片捕捉来自卫星的准确时间信息,以此为时钟源。利用单片机对接收到的时间信息进行提取和处理,并完成对单片机走时的校正。系统由单片机走时构成母钟,单片机向伺服电机发送脉冲驱动子钟走时。其优点是实现上电后的自动校时,改变了传统校时的不便,减少了机械误差,塔钟精度可达±1μs,没有累计误差。 随着经济社会的不断发展,人们生活的节奏逐步加快,人们对时间的精确度要求越来越高,尽管城市建筑物上的塔钟也越来越多,但大部分都是以传统塔钟为基础的传动、人
[单片机]
基于STC89C<font color='red'>51</font>单片机的GPS智能塔钟控制系统的研究
51单片机系列——定时/计数器
51单片机有2个16位定时器/计数器:定时器0(T0为P3.4)和定时器1(T1为P3.5) 这里所说的16位是指定时/计数器内部分别有16位的计数寄存器。分别为低8位寄存器和高8位寄存器。 定时器模式 当工作在定时模式时,每经过一个机器周期内部的16位计数寄存器的值就会加1,当这个寄存器装满时溢出。 我们可以算出工作在定时模式时最高单次定时时间为 65535*1.085us=时间(单位us) 定时器作用:可以用于精确事件定时,PWM脉宽调制,波形发生,信号时序测量的方面。 计数器模式 当工作在计数器模式时,T0(P3.4引脚),T1(P3.5引脚)。每来一个脉冲,计数寄存器加1。 使用51定时/计数器步骤
[单片机]
<font color='red'>51</font>单片机系列——定时/计数器
8051读引脚和读端口的区别
8051的P0,1,2,3口作为输出时候,差别不大,仅仅是P0口需要外接上拉电阻,大约10K就可以了; 但8051作为输入时基本相同,分为读端口和读引脚两种情况。先介绍读端口情况,实际上是读锁存器的状态,有时候需要读锁存器的状态,然后修改,这时候读的不是真正的外部数据; I/O口作为输入口时有两种工作方式即所谓的读端口与读引脚。读端口时实际上并不从外部读入数据而是把端口锁存器的内容读入到内部总线经过某种运算或变换后再写回到端口锁存器。只有读引脚时才真正地把外部的数据读入到内部总线。CPU将根据不同的指令分别发出读端口或读引脚信号以完成不同的操作,这是由硬件自动完成的不需要我们操心。读引脚时也就是把端口作为外部输入线时首先要通过外部
[单片机]
51单片机开发系列之1602字符液晶显示
从51单片机入门,对流水灯有了一定的认识后,就可以进入学习显示类的外设驱动,因为学习时往往需要直接验证、跟踪结果,显示类的外设可以把代码运行情况以非常直观的方式反馈回来。因此,笔者此处首先分析讲解1602字符型液晶的使用。 1. 1602字符型液晶概述 1602字符型液晶能够同时显示16列2行共32个字符信息。其内部已经存储了不同的点阵字符图形,包括阿拉伯数字、英文大小写、常用符号等。每个点阵字符图形都有一个固定的代码,与我们使用的ASCII码是一致的。例如大写英文字母’A’的代码为0x41,只需在需要显示的地址位置写入数据0x41即可显示出字符’A’。可用于一些简单信息交互的设计。 2. 硬件原理图 1602需三根
[单片机]
<font color='red'>51</font>单片机开发系列之1602字符液晶显示
基于51单片机的脉搏体温监测仪
一.硬件方案 系统以STC89C52单片机为核心,以光电传感器利用单片机系统内部定时器来计算时间,由光电传感器感应产生信号,单片机通过对信号累加得到脉搏跳动次数,时间由定时器定时而得。系统运行中可以通过观察指示灯闪烁,若均匀闪烁说明测量值准确。系统停止运行时,能够显示总的脉搏次数,此外我们也加了温度传感器DS18B20来检测人体温。 主要由51单片机+1602液晶显示+红外对管采集+按键+蜂鸣组成;如图: 二.设计功能 (1)本设计基于STC89C51/52(与AT89S51/52、AT89C51/52通用)单片机。 (2)LCD1602液晶显示当前的心率和当前体温,心率单位是心率/分钟,温度单位为摄氏度。 (3)手指放到
[单片机]
基于<font color='red'>51</font>单片机的脉搏体温监测仪
Keil c51 C程序延时时间
如果你要很精确的延时,可以使用定时器,C语言的定时比较难计算,你可以用KEIL里的软件仿真看看运行你的子程序需要多少时间,这样是最清楚的了。当然,如果你的编程能力已经达到比较高的水平就另一个说法,只要程序简洁,C或汇编都一样的高效率。下面我发一些别人的见解用C语言实现延时程序,首先想到的就是C常用的循环语句。下面这段代码是我经常在网上看到的: void delay2(unsigned char i){  for(; i != 0; i--);} 到底这段代码能达到多高的精度呢?为了直接衡量这段代码的效果,我把 Keil C 根据这段代码产生的汇编代码找了出来: ; FUNCTION _delay2 (BEGIN)   
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved