[热门应用] 8051汇编:EQU指令【转载】

[复制链接]
2087|2
 楼主| 123ycli 发表于 2019-6-27 17:04 | 显示全部楼层 |阅读模式
EQU是英文单词equal的缩写,因此我们也能对EQU指令有一个初步的认识:做等价替换使用。

在8051汇编语言中,EQU用于定义一个符号常量,其效果不会带来存储空间的占用(这和C语言中定义变量有区别)。它仅仅是将一个常量(立即数)用一个符号来表示,即实现常量符号化的效果。汇编编译器在编译时会将这个符号替换为对应的常量。所以,EQU的作用和C语言中的宏常量十分类似。

其格式一般如下:
  1. IDATALEN        EQU     80H
  2. COUNT           EQU     25
在8051的启动代码中我们也可以发现许多EQU指令的使用
  1. ;----------下面代码摘至STARTUP.A51-------------


  2. ; <o> IDATALEN: IDATA memory size <0x0-0x100>
  3. ;     <i> Note: The absolute start-address of IDATA memory is always 0
  4. ;     <i>       The IDATA space overlaps physically the DATA and BIT areas.
  5. IDATALEN        EQU     80H
  6. ;
  7. ; <o> XDATASTART: XDATA memory start address <0x0-0xFFFF>
  8. ;     <i> The absolute start address of XDATA memory
  9. XDATASTART      EQU     0     
  10. ;
  11. ; <o> XDATALEN: XDATA memory size <0x0-0xFFFF>
  12. ;     <i> The length of XDATA memory in bytes.
  13. XDATALEN        EQU     0      
  14. ;
  15. ; <o> PDATASTART: PDATA memory start address <0x0-0xFFFF>
  16. ;     <i> The absolute start address of PDATA memory
  17. PDATASTART      EQU     0H
  18. ;
  19. ; <o> PDATALEN: PDATA memory size <0x0-0xFF>
  20. ;     <i> The length of PDATA memory in bytes.
  21. PDATALEN        EQU     0H


 楼主| 123ycli 发表于 2019-6-27 17:05 | 显示全部楼层
为什么需要它
那么问题来了:既然汇编编译器又会把EQU符号替换回对应的常量,为什么不在代码中直接使用常量而使用EQU定义的符号呢?

原因1:使得代码易于阅读和理解
代码是写给人看的。到目前人类文明为止,只有人才能写代码。所以好的代码必须具备易读的特点,如果代码很难阅读和理解,那么它就很难被更新,扩展,重用。
例如下面第一段代码,将立即数24传送到寄存器R0中,那么24指的是什么?24岁?24千克?24mA?没有人知道。这种数在编程领域有个专业词语叫做“魔数”,指那些只知其值,不知其意的字面值数。
第二段代码使用了EQU指令,将24使用符号HOUR_PER_DAY等价表示,因此我们就知道,后面的MOV语句是将一天的小时数传送到寄存器R0中保存。
  1. ;-----------第一段代码--------------
  2. MOV R0 ,  #24

  3. ;-----------第二段代码--------------

  4. HOUR_PER_DAY    EQU    24

  5. MOV R0 , #HOUR_PER_DAY

 楼主| 123ycli 发表于 2019-6-27 17:05 | 显示全部楼层
原因2:方便后续对代码进行修改

考虑到这样一个情况,我们开发了一个称重系统,我们在代码的很多地方会用100代表称重系统支持的最大量程100KG,后来产品更新升级,量程扩大到了150KG。如果在第一版代码中我们直接使用100,那么我们就需要找到所有表示量程的100并将其改为150,这样非常麻烦,而且容易改错。如果我们使用EQU定义了一个表示量程的符号常量,那么只需要修改这个EQU定义即可。
  1. ;-----第一版代码---------------

  2. MAX_WEIGHT   EQU     100

  3. ;...业务逻辑代码
  4. ;...业务逻辑代码
  5. ;...业务逻辑代码


  6. ;-----第二版代码---------------

  7. MAX_WEIGHT   EQU     150

  8. ;...业务逻辑代码
  9. ;...业务逻辑代码
  10. ;...业务逻辑代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

40

主题

324

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部