关于单片机的【汇编指令系统】

这里写目录标题

以前的单片机几乎和MCS-51是同义词。但科技改变世界,衡量一个单片机研发工程师不再是他掌握了多少种的单片机,而是他是否能够在短时间内熟悉一种新的单片机并将其应用到他的设计中去。

也就意味着他具有研究新的芯片及指令系统的能力。

虽然C语言的应用及模块化编程思想普及,但要想深入了解单片机到底在干啥,还是绕不过汇编的坎儿。

所以一位资深的单片机开发者,一定不止懂单片机,也要懂汇编语言。

一、 发展

计算机程序设计语言,经历了从机器语言、汇编语言到高级语言的进程。

机器语言只是0 和1 的序列,运算效率最高,对编程者最不友好;

早起的汇编语言,会有一些简单的英文和符号串作为助记符号,但需要人们打孔,直到编译器被发明出来,才终结了噩梦。

编译器不是机器,是一种专门的汇编程序,负责将汇编语言翻译成二进制数的机器语言。

而后,人们又发明了更人性化的高级语言(包括C语言、c++、c# python等)

二、汇编指令的一些概念

指令格式:

bash 复制代码
标号:   操作码助记符    [操作数1],[操作数2],[操作数3]  ;注释

标号不能重复定义,一般以字母开始,其值代表它后面的指令存储地址,并不是每条指令钱都要设置标号。

操作码助记符:代表具体的指令功能。是每条指令的主体,是必需的一部分。
操作数:是传递给该指令的数据信息,告知系统该指令的操作对象。若操作数不止一个,则相互间用逗号相隔。

注释:必须以分号; 开始。这种又称为行注释。有的单片机支持/*......*/

指令周期:

是指执行一条指令需要几个机器周期。

不同指令需要不同的机器周期。

单片机不同,其指令周期和机器周期都不太一样。

指令长度:

是指一条指令在程序存储器(ROM)中需要占用的字节数。

寻址方式:

1、为什么会有寻址?

指令的操作对象(立即数、RAM寄存器(包括各类控制寄存器)、I/O口等单元)都不是单独存在的。
系统为了区分这些单元,给它们分别分配了地址编号,这个地址编号是唯一的。
当系统要访问这些单元时,必须通过锁定地址来进行访问,也称为寻址。

2、有几种寻址方式?

立即寻址:"无址寻址",如:程序要用一个立即数,直接给立即数即可,无需提供地址。
直接寻址:直接给出被访问单元的地址,让程序去访问它。(寄存器寻址:需要给出被寻址的寄存器名称,是直接寻址的一种特例。)
间接寻址:【想访问A单元,却又不给出A的地址,而是把A的地址放在B单元中,让系统先通过B单元去读A单元的地址,再用读到的地址去访问A单元。】

其中B单元相当于"地址指针"。
间接寻址的一个主要用途用来对一组数据进行相同或相似的操作。 【只需把该组单元的首地址(尾地址)送到地址指针中,再写一个循环结构的程序,在循环体内对指针指向的当前单元进行操作;每循环一次,将地址指针+1(或-1);如此反复,知道所有单元操作结束(循环计数溢出)】

MCS-51,还有间接寻址的方式,叫变址寻址,这种方式用于访问程序存储器。变址寻址中,被访问地址由两部分合成。【一个是基址(存放基址寄存器中),一个是变址(存放在变址寄存器中,一般有A累加器担任变址寄存器)】

变址寻址的主要作用:数据查表功能和程序散转功能。

三、汇编指令的分类

按照指令执行的功能进行分类:数据传送类、算术运算类、逻辑运算类、控制转移类、位操作类、特殊功能类。

【以MCS-51为例】,其它的单片机略有不同。

1 数据传送类

定义:将数据从一个单元传送到另一个单元的指令属于数据传送类。
代表指令:MOV指令【实际执行的是copy功能,因为数据从源单元传送到目标单元后,源单元的数据仍完整的保存着。】、MOVX(针对外部RAM)、MOVC(程序ROM)、XCH(交换)、XCHD(半字节交换)、SWAP(高低半字节交换)、PUSH、POP等指令。

2 算术运算类

代表指令:加法指令(ADD、ADDC)、减法指令(SUBB)、递增/递减指令(INC、DEC)、乘法指令(MUL)、除法指令(DIV)、十进制调整指令(DA),主要用于十进制BCD码加法运算的结果修正 。

3 逻辑运算类

根据操作数目分为:双操作数逻辑运算指令和单操作数逻辑运算指令。
双操作数指令主要有:与操作指令(ANL)、或(ORL)、异或(XRL)
单操作数指令主要由:非(取反)操作指令(CPL)、清零(CLR)、移位(RL、RLC、RR、RRC)等。

4、控制转移类

程序执行顺序:顺序执行、分支和循环。

控制转移类指令根据其条件的有无分为:无条件转移指令和条件转移指令,还有一些会改变PC指针状态的指令。

无条件指令有:长转移(LJMP)、绝对转移(AJMP)、短转移(SJMP)、变址转移(JMP)。前三种都是用来改变PC指针,其间的区别是各自跳转地址范围有所不同。最后一条(JMP)则是用来实现程序的散转功能。

条件转移指令:测试条件符号转移指令(JZ、JNZ、JC、JNC、JB、JNB、JBC)、数值比较(不相等)(CJNE)、减一条件(结果不为零)(DJNE)(常用来控制循环次数)。

其它改变PC指针状态的指令主要有:子程序调用指令(ACALL、LCALL)、子程序或中断服务程序返回指令(RET、EETI)以及一条空操作指令(NOP).

5 位操作类
主要包括:传送指令(MOV)、位逻辑运算指令(ANL、ORL、CPL)、位置位/复位指令(CLR、SETB)。

另外一些测试条件符号转移指令(JC、JNC、JB、JNB、JBC)也是根据对位测试并进行转移,所以也可归属位操作类。

6 特殊功能类

喂狗指令(WDTC)、低功耗控制指令(SLEP)等。

伪指令和宏。

参考目录

参考学习书目:《匠人手记:一个单片机工作者的实践和思考》

借用作者话,"技术源于积累,成功源于执着。"共勉~

相关推荐
最后一个bug1 小时前
rt-linux中使用mlockall与free的差异
linux·c语言·arm开发·单片机·嵌入式硬件·算法
musir11 小时前
寄存器控制LED灯亮
单片机
JaneZJW1 小时前
Proteus仿真——《51单片机AD和DA转换器的设计》
单片机·嵌入式硬件·51单片机·proteus
NEWEVA__zzera224 小时前
利用光耦来隔离485芯片与串口引脚,实现自动收发485电路
单片机·嵌入式硬件
m0_748240544 小时前
STM32第十一课:STM32-基于标准库的42步进电机的简单IO控制(附电机教程,看到即赚到)
stm32·单片机·嵌入式硬件
温柔的男孩像海洋丶4 小时前
vscode的keil assistant 中搜索不到全局变量
ide·vscode·单片机
沐欣工作室_lvyiyi4 小时前
基于单片机的多功能智能小车(论文+源码)
stm32·单片机·嵌入式硬件·毕业设计·单片机毕业设计
鸿喵小仙女5 小时前
C# WPF读写STM32/GD32单片机Flash数据
stm32·单片机·c#·wpf
lucy153027510795 小时前
MCU 功耗基准测试
科技·单片机·嵌入式硬件·智能家居·信号处理·工控主板
m0_748240916 小时前
OpenMV与STM32通信全面指南
stm32·单片机·嵌入式硬件