8051汇编:EQU指令
关于EQU汇编指令
EQU是英文单词equal的缩写,因此我们也能对EQU指令有一个初步的认识:做等价替换使用。
在8051汇编语言中,EQU用于定义一个符号常量,其效果不会带来存储空间的占用(这和C语言中定义变量有区别)。它仅仅是将一个常量(立即数)用一个符号来表示,即实现常量符号化的效果。汇编编译器在编译时会将这个符号替换为对应的常量。所以,EQU的作用和C语言中的宏常量十分类似。
其格式一般如下:
IDATALEN EQU 80H
COUNT EQU
在8051的启动代码中我们也可以发现许多EQU指令的使用
;----------下面代码摘至STARTUP.A51------------- ; <o> IDATALEN: IDATA memory size <0x0-0x100>
; <i> Note: The absolute start-address of IDATA memory is always 0
; <i> The IDATA space overlaps physically the DATA and BIT areas.
IDATALEN EQU 80H
;
; <o> XDATASTART: XDATA memory start address <0x0-0xFFFF>
; <i> The absolute start address of XDATA memory
XDATASTART EQU
;
; <o> XDATALEN: XDATA memory size <0x0-0xFFFF>
; <i> The length of XDATA memory in bytes.
XDATALEN EQU
;
; <o> PDATASTART: PDATA memory start address <0x0-0xFFFF>
; <i> The absolute start address of PDATA memory
PDATASTART EQU 0H
;
; <o> PDATALEN: PDATA memory size <0x0-0xFF>
; <i> The length of PDATA memory in bytes.
PDATALEN EQU 0H
为什么需要它
那么问题来了:既然汇编编译器又会把EQU符号替换回对应的常量,为什么不在代码中直接使用常量而使用EQU定义的符号呢?
原因1:使得代码易于阅读和理解
代码是写给人看的。到目前人类文明为止,只有人才能写代码。所以好的代码必须具备易读的特点,如果代码很难阅读和理解,那么它就很难被更新,扩展,重用。
例如下面第一段代码,将立即数24传送到寄存器R0中,那么24指的是什么?24岁?24千克?24mA?没有人知道。这种数在编程领域有个专业词语叫做“魔数”,指那些只知其值,不知其意的字面值数。
第二段代码使用了EQU指令,将24使用符号HOUR_PER_DAY等价表示,因此我们就知道,后面的MOV语句是将一天的小时数传送到寄存器R0中保存。
;-----------第一段代码--------------
MOV R0 , # ;-----------第二段代码-------------- HOUR_PER_DAY EQU MOV R0 , #HOUR_PER_DAY
原因2:方便后续对代码进行修改
考虑到这样一个情况,我们开发了一个称重系统,我们在代码的很多地方会用100代表称重系统支持的最大量程100KG,后来产品更新升级,量程扩大到了150KG。如果在第一版代码中我们直接使用100,那么我们就需要找到所有表示量程的100并将其改为150,这样非常麻烦,而且容易改错。如果我们使用EQU定义了一个表示量程的符号常量,那么只需要修改这个EQU定义即可。
;-----第一版代码--------------- MAX_WEIGHT EQU ;...业务逻辑代码
;...业务逻辑代码
;...业务逻辑代码 ;-----第二版代码--------------- MAX_WEIGHT EQU ;...业务逻辑代码
;...业务逻辑代码
;...业务逻辑代码
8051汇编:EQU指令的更多相关文章
- ARM汇编常用指令
RAM汇编常用指令有MOV B BL LDR STR
- 汇编 LEA 指令
知识点: LEA指令 &与LEA OD里修改汇编代码 一.LEA指令格式 有效地址传送指令 LEA 格式: LEA 操作数A, 操作数B 功能: 将操作数B的有效地址传送到指定的的 ...
- 汇编 ADD指令
知识点: 加法汇编指令ADD 一.加法指令 ADD(Addition) 格式 格式: ADD A,B //A=A+B; 功能: 两数相加 . OPRD1为任一通用寄存器或存储器操作数,可以是任意一个 ...
- 汇编-MOV指令
知识点: MOV指令 基址 内联汇编 把OD附加到资源管理器右键菜单 一.MOV指令 aaa=0x889977;//MOV DWORD PTR DS:[0x403018],0x8899 ...
- 汇编_指令_IRET
IRET(interrupt return)中断返回,中断服务程序的最后一条指令. 汇编指令IRET [指令格式]IRET [指令功能]IRET(interrupt return)中断返回,中 ...
- ARM汇编基础指令
Cortex-A7 常用汇编指令 一.处理器内部数据传输指令 1.mov 将数据从一个寄存器拷贝到另外一个寄存器,或者将一个立即数传递到寄存器里面 MOV R0,R1 @将寄存器 R1 中的数据传递给 ...
- C语言中插入汇编nop指令
工作过程中,有的时候需要打桩cycle,想在C语言中插入nop指令,可以采取的方法是 头文件中加入#inlude <stdio.h> 定义一个内联函数,然后调用这个函数,不过得测一下平台调 ...
- 汇编 循环位移指令 ROL, 循环位移指令 ROR
知识点: 循环位移指令 ROL 循环位移指令 ROR 一.循环位移指令 ROL ROR int i=0x77886611;//01110111100010000110011000010001 ...
- 汇编 浮点指令FLD,FSTP,FADD与FPU寄存器
知识点: 浮点数的存放方式 st0至st7 FLD,FST,FADD指令 一.浮点数的存放方式 00401000 /$ 55 PUSH EBP 00401001 |. 8BEC MOV E ...
随机推荐
- 本地文件上传GitHub
(1)mkdir 项目名称(2)cd 项目名称(3)git init 把它变成可管理的Git仓库(4)git status 查看状态(5)git add . 点用空格隔开(6)git status ...
- 牛客网-C++
2017/8/18 程序运行结束时才释放:静态变量在内存的静态存储区,静态数据一直占有着该存储单元直到程序结束:一般局部变量在函数调用结束后释放变量占用的存储单元,而静态局部变量不释放. 静态全局变量 ...
- 2018年东北农业大学春季校赛 I-wyh的物品(二分查找)
链接:https://www.nowcoder.com/acm/contest/93/I来源:牛客网 题目描述 wyh学长现在手里有n个物品,这n个物品的重量和价值都告诉你,然后现在让你从中选取k个, ...
- Oracle中连接与加号(+)的使用
1.左外连接(Left outer join/ left join) left join是以左表的记录为基础的,左表的记录将会全部表示出来,而右表只会显示符合搜索条件的记录.右表记录不足的地方均为NU ...
- ABAP语言实现 左移 <<、无符号右移 >>> 位移操作
这几天要在ABAP中实现 3DES 标准对称加密算法,与其他外部系统进行加密/解密操作.由于ABAP语言中没有 左移 <<.无符号右移 >>> 操作,只能自己实现 思路 ...
- IntelliJ IDEA使用maven-javadoc-plugin生成Java Doc控制台乱码
问题描述 在使用IDEA生成Java Doc的过程中,发现IDEA控制台乱码,作为有轻微代码强迫症的我来说,这是不可忍受的,需要鼓捣一番.先上pom.xml中的javadoc插件配置 <!--配 ...
- netty源码解析目录
第一章 java nio三大组件与使用姿势 二.netty使用姿势 三.netty服务端启动源码 四.netty客户端启动源码 五.NioEventLoop与netty线程模型 六.ChannelPi ...
- CentOS安装Navicat
首先,下载文件navicat120_mysql_cs_x64.tar.gz,然后用命令 tar -zxvf 解压.解压以后,进入解压目录,运行start_navicat,就可以运行了. 运行以后,可能 ...
- 查看PostgreSQL正在执行的SQL
SELECT procpid, START, now() - START AS lap, current_query FROM ( SELECT backendid, pg_stat_get_back ...
- 适用于 Windows 10 的触摸板手势
高级用户! 在 Windows 10 笔记本电脑的触摸板上试用这些手势: 选择项目:点击触摸板. 滚动:将两根手指放在触摸板上,然后以水平或垂直方向滑动. 放大或缩小:将两根手指放在触摸板上,然后收缩 ...