51单片机汇编框架.docVIP

  • 20
  • 0
  • 约4.8千字
  • 约 4页
  • 2019-10-19 发布于江西
  • 举报
51汇编程序基本框架(不要再用 equ 来定义变量了) 看了一些人写的51汇编程序,发现有不少人在用 equ 来分配变量, 觉得有必要向大家介绍一种比较好的变量定义方法。 先说说用 equ 定义变量的缺点: 1:人为为每一个变量指定地址,还必须要防止地址冲突,工作量太大。 2:编译器只是把用 equ 定义的标识符当作常数而已,在很多情况下当 用户把该标识符用错时,编译器不会给出警告或报错。 例如,假设想在 IDATA 区定义一个变量,如果用 equ 方式作如下定义: MyByte equ 87h ;(其实编译器只是将 MyByte 视为一个常量而已) 如果想将该变量(位于 IDATA 区)赋值到累加器 a,正确的访问方式应该是 mov r0,#MyByte mov a,@r0 如果程序员将上面的语句错写为 mov a,MyByte (原因可能是粗心,或者忘记了 MyByte 是大于 7Fh 的) 编译器不会为此报错,结果执行的操作是将地址为 87h 的特殊功能寄存器 的内容赋值到 a,而不是将 IDATA 区的 87h 赋值到 a,与用户的本意大相径庭。 这只是一个例子,实际上还会有其它类似的问题。 如果使用了下面描述的方式,则编译器会帮你指出此类错误。 所以,不要再用 equ 来定义变量了,这是一种很不好的方法,应该淘汰了。 建议 equ 只用于定义常数,不要做其它用途。 下面是一种比较好的变量定义方法,没有上面所说的缺点。 ;定义变量的方法: ;1:定义字节变量用 ds 关键字,语法为: ; 变量名 ds 分配的字节数 ;2:定义位变量用 dbit 关键字,语法为: ; 位变量名 dbit 分配的位数 ;3:定义特殊功能寄存器(SFR)用 data 关键字,语法为: ; 寄存器名 data 寄存器地址 ;4:定义可位寻址的特殊功能寄存器中的位用 bit 关键字,语法为: ; 位名 bit 位地址 ;5:常量定义用 equ 关键字,语法为: ; 常量名 equ 常数 ;具体见如下示例: ;51汇编程序基本框架 ;在万利 MedWin3 下编译通过,在 Keil C 8.08 下编译通过。 ;作者:icmap ;日期:2008-09-13 $NOMOD51 ;如果不使用默认的 51 特殊功能寄存器定义,可以用本语句取消。 ;$include (W79E825.inc) ;用此语句可以包含头文件 ;---------- 特殊功能寄存器定义 (仅作示范,不全) p0 data 080h sp data 081h dpl data 082h dph data 083h pcon data 087h tcon data 088h tmod data 089h tl0 data 08ah tl1 data 08bh th0 data 08ch th1 data 08dh p1 data 090h scon data 098h sbuf data 099h p2 data 0a0h ie data 0a8h psw data 0d0h ;---------- 可位寻址的特殊功能寄存器中的位定义(仅作示范,不全) bitIT0 bit tcon.0 ;外部中断0触发方式 bitIE0 bit tcon.1 ;外部中断0标志 bitIT1 bit tcon.2 ;外部中断1触发方式 bitIE1 bit tcon.3 ;外部中断1标志 bitTR0 bit tcon.4 ;定时器0启动控制 bitTF0 bit tcon.5 ;定时器0溢出标志 bitTR1 bit tcon.6 ;定时器1启动控制 bitTF1 bit tcon.7 ;定时器1溢出标志 bitRI bit scon.0 ;接收中断标志 bitTI bit scon.1 ;发送中断标志 bitRB8 bit scon.2 bitTB8 bit scon.3

文档评论(0)

1亿VIP精品文档

相关文档