标题: Keil汇编进阶指南(3) - 头文件、定义与变量 [打印本页]

作者: Astrix    时间: 2024-11-29 21:14
标题: Keil汇编进阶指南(3) - 头文件、定义与变量
头文件、定义与变量
当你看见这个标题的时候,可能会震惊,啥,汇编也有头文件?
是的,但是和C不同,汇编使用的是.inc文件,和C一样,里面放着一些定义
我们通常使用EQU定义常量和引脚,以及DATA,BIT,IDATA等一系列定义,但最常用的是DATA
(新版有MPL宏,但旧版不支持,估计刚出没多久,在此不再叙述,可去官方文档查看)
按照上一章节的任务,也就是制作一个LCD1602的库函数,我们开始我们的定义
首先新建一个inc文件,里面定义引脚,使用头文件的好处就是可以随时让别人改
  1.         LCD_RS EQU P2^6
  2.         LCD_RW EQU P2^5
  3.         LCD_EN EQU P2^7
  4.         LCD_BUS EQU P0;和C不一样,汇编使用分号打注释
复制代码
好了,当我们使用的时候可以直接使用LCD_RS来代替P2^6,这样的好处就是一旦引脚变了,你只需要改一次
这一部分说完了,现在该变量了
基本上定义是这样的
变量名 类型 地址
比如:
  1. PORT1     DATA    90h
复制代码

支持的有DATA,BIT,XDATA等类型
这些在一些教程中讲解的比较详细,故不再赘述
实际上,还有另一种方法定义变量,特别是连续的变量,我们继续LCD1602的任务,为了快速显示,我们要在内存开辟一块缓冲区(不建议正式程序中使用,无他,内存很宝贵),大小是32个char类型,在上一节中我们介绍了段的声明,我们决定在内存中划一块连续的区域,就像这样
  1. ?DT?LCDMEM SEGMENT DATA
  2.                 PUBLIC LCDMEM
  3.                 RSEG ?DT?LCDMEM
  4.         LCDMEM:
  5.                 DS 32
复制代码

DS就是留出区域,和DB类似,这里不再赘述,可以查看官方文档
至于PUBLIC和标记,我们放在下一节详细叙述


注:针对于ORG等段定位问题在上一个帖子表述错误,我去仔细看了文档,做了一些实验
ORG使用的是一种相当离谱的定位方式,首先它是段内定位,也就是所谓的“相对定位”,它的计数是从上一个SEGMENT标记开始(CSEG在编译时会转换为一个SEGMENT的声明,所以CSEG开头也算一个独立的段),如果没有SEGMENT标记则从0开始,离谱的地方是它直接将前面的内存空间据为己有,也就是说,你如果ORG 0100H,前面0100H都被申请走了,在别的文件里申请这一空白区域的时候会显示被占用的warning
所谓的段和段之间“打架”,确实不会打架(不会报error)
因为它直接覆盖掉了(后面的代码覆盖前面的)……而且最恐怖的是,因为古早写的程序都是这样互相覆盖来复用内存的,所以覆盖本身是没有warning的,最多BL51会给你一个占用的warning……
再加上ORG的离谱特性,你在不同文件内写代码的时候想要利用ORG占用的空间,只能忽略warning,这时候就会根本不清楚有没有覆盖前面或后面的代码……
虽然CSEG也会出现覆盖的情况,但只要保证同一文件内不出现同样的CSEG地址,可以有效避免覆盖的情况(因为会弹warning)
但ORG就不一定了……

作者: Alex1972    时间: 2024-11-30 08:12
哦哦哦,这样!
作者: 188610329    时间: 2024-12-3 21:41
定义引脚和定义寄存器其实是一样的,不适合用 EQU。应该用BIT 和 DATA 如果定义 扩展寄存器(XFR) 就用 XDATA
和C 里面不应该用 define 来定义 寄存器一个道理。虽然,现在很多 C 的头文件 用 define 来定义 扩展寄存器,但实际上, 应该用  unsigned char xdata _at_ 0x????  来定义扩展寄存器,起到 “占位” 的作用。

是的, 之所以,不应该用 EQU / define 这些来定义寄存器或者申明变量, 最主要的原因就是 这两样 都不占位。




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1