3.1 汇编语言概述
汇编语言(Assembly Language)是一种面向机器的程序设计语言,它使用助记符来代替操作码,用地址符号来代替地址码,从而使得程序员能够以更接近人类理解的方式编写底层代码。
3.1.1 汇编语言指令格式
3.1.2 描述操作数的简记符号
---------------------------------------------------------------------------------------------------------------------------------
3.2 MCS-51指令系统简介
3.2.1 寻址方式
CPU获取操作数的方法被称为寻址方式。MCS-51单片机共支持七种不同的寻址方式:立即寻址、寄存器寻址、直接寻址、寄存器间接寻址、变址寻址、相对寻址以及位寻址。
这些寻址方式是对操作数存放规律的总结。在实际应用中,具体某条指令属于哪种寻址方式通常并不关键,也不会影响其使用效果,因此无需过分纠结于分类细节。
3.2.2 数据传送与交换类指令
RAM:类似于计算机中的内存,用于临时存储运行时数据,断电后数据会丢失。
ROM:类似于计算机的硬盘,用于永久保存程序代码和常量信息,即使断电内容也不会消失。
寄存器寻址
寄存器间接寻址
变址寻址
3.2.3 算术运算类指令
算术运算类指令主要用于实现加法、减法、乘法、除法以及增量(+1)、减量(-1)等基本数学运算功能,共包含21条相关指令。
立即寻址
直接寻址
3.2.4 逻辑运算及移位类指令
逻辑运算及移位类指令可完成与、或、异或、取反、置位、清零以及左/右移位等功能,总计有34条指令。
字节级别的运算通常将累加器A作为目的操作数(#data与direct之间的运算除外),而位级别的运算则以进位标志C作为结果的存储位置。
所有位(1位)运算指令均将进位标志C作为结果寄存单元;大多数字节(8位)运算指令则把累加器A作为结果的存放目标。
3.2.5 控制转移类指令
控制转移类指令通过修改程序计数器PC的值,实现程序执行流程的跳转,这类指令共有22条。
无条件转移
MCS-51单片机中不同跳转指令所支持的地址范围如下所示。“位”在此处指的是指令中用于表示目标地址的二进制位数,该数值决定了跳转指令的最大跳跃距离(即寻址范围)。
-
LJMP - 16位地址
- 含义:采用完整的16位地址进行跳转
- 寻址范围:0000H ~ FFFFH(覆盖整个64KB程序空间)
- 特点:可跳转至程序存储器任意位置
- 示例:
assembly LJMP 1234H ; 无条件跳转到地址1234H LJMP MAIN ; 跳转到标号MAIN所在位置(无论其位于何处)
-
SJMP - 8位地址
- 含义:使用8位有符号偏移量进行相对跳转
- 寻址范围:相对于当前PC值的-128到+127字节范围内
- 特点:适用于短距离跳转,常见于循环结构和条件分支
- 示例:
assembly LOOP: MOV A, #55H DJNZ R0, LOOP ; 循环跳转(短距离) SJMP $ ; 原地跳转($代表当前地址)
相对寻址
相对寻址依赖于“相对偏移量”,用于相对转移指令中,表示从下一条指令地址到目标地址之间的偏移距离。
该偏移量是一个8位有符号数,取值范围为:
- 十进制:-128 至 +127
- 十六进制:80H 至 7FH
跳转目标地址计算公式为:
目标地址 = 当前PC值 + 当前指令长度(字节数) + rel
其中:
- 当前PC值:当前指令的起始地址
- 指令字节数:当前指令所占的字节总数
- rel:相对偏移量
rel
rel
direct
直接地址说明
= 直接地址:指明要访问的具体内存单元地址。
地址范围:00H ~ FFH,涵盖片内RAM区域及特殊功能寄存器(SFR)。
与立即数的区别:不带“#”符号,表示的是地址而非常数值。
#
位寻址
条件转移指令
条件转移指令主要包括以下三类:
- JZ / JNZ —— 判断累加器是否为零后跳转(Jump if Zero / Not Zero)
- CJNE —— 比较两数是否不等,若不等则跳转(Compare and Jump if Not Equal)
- DJNZ —— 先递减寄存器值,若结果非零则跳转(Decrement and Jump if Not Zero)
3.2.6 伪指令
在汇编语言中,伪指令用于指导汇编器如何处理源代码,它们并不生成实际的机器指令,而是在汇编过程中起控制作用。常见的伪指令包括符号定义、数据存储分配、程序起始地址设定等。
例如,可以使用伪指令来定义常量、分配内存空间、设置程序入口点以及包含其他文件内容。这些指令帮助程序员更好地组织和管理代码结构,提高程序的可读性和维护性。
基于进位标志CY的转移(Jump on Carry)
这类转移指令根据进位标志位CY的状态决定是否跳转。当CY = 1时执行跳转,称为JC;当CY = 0时跳转,则为JNC。此类指令常用于无符号数运算后的条件判断。
比较不相等则跳转指令(CJNE - Compare and Jump if Not Equal)
CJNE指令用于比较两个操作数,若不相等则发生跳转。该指令同时会影响进位标志CY:如果第一个操作数小于第二个,则CY被置1;否则清零。此功能常用于数值大小判断。
注意:在此类操作中,CY标志应由系统内部自动设置,但在显示层面不应直接暴露给用户或显式呈现。
累加器A判零转移(Jump if Zero)
该类转移指令通过检测累加器A的内容是否为零来决定程序流向。若A=0,则执行跳转;反之继续顺序执行。这类指令适用于判断运算结果是否为空或完成特定条件分支处理。
循环控制指令(DJNZ - Decrement and Jump if Not Zero)
DJNZ指令先将指定寄存器或内存单元的值减1,然后判断结果是否非零。若不为零,则跳转到目标地址继续循环;为零则退出循环。该指令广泛应用于计数型循环结构中。
位条件转移指令(如JB, JNB, JBC等)
此类指令依据某个特定位的状态(置位或清零)来决定是否跳转。JB表示位为1时跳转,JNB表示位为0时跳转,JBC则在位为1时跳转并自动将其清零。这些指令常用于实时状态监控与响应处理。



雷达卡


京公网安备 11010802022788号







