关于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指令的更多相关文章

  1. ARM汇编常用指令

    RAM汇编常用指令有MOV B BL LDR  STR

  2. 汇编 LEA 指令

    知识点:  LEA指令  &与LEA  OD里修改汇编代码 一.LEA指令格式 有效地址传送指令 LEA 格式: LEA 操作数A, 操作数B 功能: 将操作数B的有效地址传送到指定的的 ...

  3. 汇编 ADD指令

    知识点: 加法汇编指令ADD 一.加法指令 ADD(Addition) 格式 格式: ADD A,B //A=A+B; 功能: 两数相加 . OPRD1为任一通用寄存器或存储器操作数,可以是任意一个 ...

  4. 汇编-MOV指令

    知识点:  MOV指令  基址  内联汇编  把OD附加到资源管理器右键菜单 一.MOV指令 aaa=0x889977;//MOV DWORD PTR DS:[0x403018],0x8899 ...

  5. 汇编_指令_IRET

    IRET(interrupt return)中断返回,中断服务程序的最后一条指令.   汇编指令IRET [指令格式]IRET   [指令功能]IRET(interrupt return)中断返回,中 ...

  6. ARM汇编基础指令

    Cortex-A7 常用汇编指令 一.处理器内部数据传输指令 1.mov 将数据从一个寄存器拷贝到另外一个寄存器,或者将一个立即数传递到寄存器里面 MOV R0,R1 @将寄存器 R1 中的数据传递给 ...

  7. C语言中插入汇编nop指令

    工作过程中,有的时候需要打桩cycle,想在C语言中插入nop指令,可以采取的方法是 头文件中加入#inlude <stdio.h> 定义一个内联函数,然后调用这个函数,不过得测一下平台调 ...

  8. 汇编 循环位移指令 ROL, 循环位移指令 ROR

    知识点:  循环位移指令 ROL  循环位移指令 ROR 一.循环位移指令 ROL ROR int i=0x77886611;//01110111100010000110011000010001 ...

  9. 汇编 浮点指令FLD,FSTP,FADD与FPU寄存器

    知识点:  浮点数的存放方式  st0至st7  FLD,FST,FADD指令 一.浮点数的存放方式 00401000 /$ 55 PUSH EBP 00401001 |. 8BEC MOV E ...

随机推荐

  1. javascript对属性的操作

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  2. Docker 常用命令(二)

    4. 查看Docker镜像创建历史: docker history flaskhello 3. Docker提交镜像 docker build -t flaskhello . docker run - ...

  3. Servlet(9)—HttpServlet和改进Servlet实例

    HttpServlet:针对Http协议定义的一个Servlet基类,唯一的功能就是强制类型转换ServletRequest转换成HttpServletRequest,ServletResponse转 ...

  4. Servlet(7)—ServletConfig接口和SevletContext接口

    ServletConfig接口 1. 可以获取当前Servlet在web.xml中的配置信息(用的不多) 2. 在不使用"硬编码"的情况下,将部署状态信息传递给Servlet.这个 ...

  5. Unity3d XmlException: Text node cannot appear in this state的方案

    这个问题是utf-8编码的问题,如果是utf-8+bom那么就会出现这种问题,如果是单纯的utf-8就没有这种问题(当然如果你把他完全变成ansi,那也行) 我在读写xml的时候遇到这个问题.查了好久 ...

  6. redis启动出错Creating Server TCP listening socket 127.0.0.1:6379: bind: No error(转)

    redis启动出错Creating Server TCP listening socket 127.0.0.1:6379: bind: No error   windows下安装Redis第一次启动报 ...

  7. 分享12款令人瞠目结舌的WebVR演示和实验效果

    不管你信不信, WebVR绝对是浏览器下一个让你激动的技术方向, 也许很快你就可以使用VR头显或者相关设备直接访问web内容和资源啦! 在这篇资源分享帖中,我们将介绍很多基于浏览器的VR演示和游戏,帮 ...

  8. SpringBoot之整合Redis分析和实现-基于Spring Boot2.0.2版本

    背景介绍 公司最近的新项目在进行技术框架升级,基于的Spring Boot的版本是2.0.2,整合Redis数据库.网上基于2.X版本的整个Redis少之又少,中间踩了不少坑,特此把整合过程记录,以供 ...

  9. GitHub删除已有仓库

    之前都只是创建,还没试过删除,讲道理,如果第一次找删除按钮,还是有点小曲折的,特记录如下: 1.先找到你要删除的仓库 2.点进去,到具体项目地址,找到setting 3.点进去,一直往下翻,会看到红色 ...

  10. R语言之Random Forest随机森林

    什么是随机森林? 随机森林就是通过集成学习的思想将多棵树集成的一种算法,它的基本单元是决策树,而它的本质属于机器学习的一大分支——集成学习(Ensemble Learning)方法.随机森林的名称中有 ...