C51汇编伪指令(转载)

您所在的位置:网站首页 伪指令定义 C51汇编伪指令(转载)

C51汇编伪指令(转载)

2024-07-11 15:25| 来源: 网络整理| 查看: 265

1、DS ---预留存储区命令格式: 〔标号:〕 DS   表达式值其功能是从指定地址开始,定义一个存储区,以备源程序使用。存储区预留的存储单元数由表达式的值决定。TMP:   DS   1从标号TEP地址处开始保留1个存储单元(字节)。2、BIT---定义位命令格式:   字符名称   BIT   位地址其功能用于给字符名称定义位地址。SPK   BIT   P3.7经定义后,允许在指令中用SPK代替P3.7。3、USING指令USING指令通知汇编器使用8051的哪一个工作寄存器组。格式: USING 表达式 (值必须为0-3,默认值为0。)USING 0使用第0组工作寄存器。4、SEGMENT指令SEGMENT 指令用来声明一个再定位段和一个可选的再定位类型。格式: 再定位段名 SEGMENT 段类型〔再定位类型〕其中,“再定位段名”用于指明所声明的段。“段类型”用于指定所声明的段将处的存储器地址空间。可用的段类型有 CODE、XDATA、DATA、IDATA和BIT。STACK_SEG SEGMENT IDATADATA_SEG SEGMENT DATA5、RSEG---再定位段选择指令再定位段选择指令为RSEG,用于选择一个已在前面定义过的再定位段作为当前段。格式: RSEG 段名段名必须是在前面已经声明过的再定位段。DATA_SEG SEGMENT DATA   ;声明一个再定位DATA段RSEG   DATA_SEG   ;选择前面声明的再定位DATA段作为当前段6、绝对段选择指令CSEG---绝对代码段DSEG---内部绝对数据段XSEG---外部绝对数据段ISEG---内部间接寻址数据段BSEG---绝对位寻址数据段格式:CSEG [AT 绝对地址表达式]DSEG [AT 绝对地址表达式]XSEG [AT 绝对地址表达式]ISEG [AT 绝对地址表达式]BSEG [AT 绝对地址表达式]括号内是可选项,用来指定当前绝对段的基地址。CSEG AT 0000HAJMP MAIN7、ORG指令ORG指令用来改变汇编器的计数器,从而设定一个新的程序起始地址。格式: ORG 表达式表达式必须是绝对或简单再定位表达式。ORG 0000HAJMP MAIN设定 MAIN 程序的起始地址为 0000H。8、END指令END指令用来控制汇编结束。在每个汇编程序的最后一行必须有一条END指令,并且END指令只能出现一次。9、EQU指令EQU 指令用于将一个数值或寄存器名赋给一个指定的符号名。格式: 符号名   EQU   表达式或     符号名   EQU   寄存器名表达式必须是一个简单再定位表达式。用 EQU 指令赋值以后的字符名,可以用作数据地址、代码地址、位地址或者直接当做一个立即数使用。LIMIT   EQU   1200COUNT   EQU   R510、DATA 指令DATA 指令用于将一个内部 RAM 的地址赋给指定的符号名。格式: 符号名   DATA   表达式数值表达式的值在 0-255 之间,表达式必须是一个简单再定位表达式。PORT1   DATA   40H11、DB 指令DB 指令以表达式的值的字节形式初始化代码空间。格式: [标号:]   DB   表达式表表达式中可包含符号、字符串、或表达式等项,各个项之间用逗号隔开,字符串应用引号括起来。括号内的标号是可选项,如果使用了标号,则标号的值将是表达式表中第一字节的地址。DB 指令必须位于 CODE 段之内,否则将会发生错误。TABLE:DB 0C0H, 0F9H, 0A4HTABLE1:DB " 89C51 "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 只用于定义常数,不要做其它用途。下面是一种比较好的变量定义方法,没有上面所说的缺点。;定义变量的方法:;1:定义字节变量用 DS 关键字,语法为:;   变量名: DS 分配的字节数;2:定义位变量用 DBIT 关键字,语法为:;   位变量名:   DBIT 分配的位数;3:定义特殊功能寄存器(SFR)用 DATA 关键字,语法为:;   寄存器名: DATA 寄存器地址;4:定义可位寻址的特殊功能寄存器中的位用 BIT 关键字,语法为:;   位名: BIT 位地址;5:常量定义用 EQU 关键字,语法为:;   常量名: EQU 常数;具体见如下示例:;51汇编程序基本框架$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  BITREN     BIT SCON.4 ;接收使能  BITSM2     BIT SCON.5 ;多机通信控制  BITSM1     BIT SCON.6 ;串口模式位1  BITSM0_FE   BIT SCON.7 ;串口模式位0或FE;---------- 常量定义NSTACKSIZE     EQU 36   ;指定堆栈大小;---------- 以下为变量定义;如果MCU没有某些数据段,就删除或注释掉相应的段。;变量定义有不可重定位和可重定位之分,这二种方式可混合使用。;需要注意的是,某些编译器对可重定位方式支持的不是很好,;而且可重定位方式对汇编不是很有用,所以建议不用可重定位方式。;---- 下面为不可重定位的变量分配方式; BSEG 关键词指定 BIT 区; DSEG 关键词指定 DATA 区; ISEG 关键词指定 IDATA 区; XSEG 关键词指定 XDATA 区; CSEG 关键词指定 CDATA 区;注意:BIT 区的位地址 20H~2FH 范围与 DATA 区的00H~7FH范围是同一存储空间,; 所以在分配 DATA 区字节变量和 BIT 区位变量时要注意不要重叠。  BSEG   AT 00H ;从 BIT 区的位地址 00H 开始分配位变量BEXAMPLE:     DBIT 1 ;在 BIT 区定义一个位变量,位地址为 00H(即DATA区20H字节的第0位)BTESTA:       DBIT 1 ;在 BIT 区定义一个位变量,位地址为 01H(即DATA区20H字节的第1位)BTESTB:       DBIT 1 ;在 BIT 区定义一个位变量,位地址为 02H(即DATA区20H字节的第2位);在 DATA 区定义变量时要注意不要与 R0~R7 寄存器重叠。  DSEG   AT 08H ;从 DATA 区的 08H 地址(为了避开 R0~R7)开始分配变量DEXAMPLE:     DS   2 ;在 DATA 区定义一个 2 字节的变量,地址为 08HDTEST:       DS   1 ;在 DATA 区定义一个 1 字节的变量,地址为 0AHDLCDBUFFER:   DS   21 ;注意不要与 BIT 区重叠,建议在地址 1FH 结束分配。DSEG   AT   2EH ;在 DATA 区的可位寻址区域定义可位寻址的字节变量              ;注意不要与前面在 BIT 区分配的 BIT 位重叠DBYTEA:       DS   1 ;在 DATA 区定义一个 1 字节的变量,地址为 2EH(此变量可位寻址)DBYTEB:       DS   1 ;在 DATA 区定义一个 1 字节的变量,地址为 2FH(此变量可位寻址)DSEG   AT 30H ;从 DATA 区的 30H 地址(已避开 BIT 区)开始分配变量DBYTEC:       DS   1 ;在 DATA 区定义一个 1 字节的变量,地址为 30HDBYTED:       DS   3 ;在 DATA 区定义一个 3 字节的变量,地址为 31HDBYTEE:       DS   1 ;在 DATA 区定义一个 1 字节的变量,地址为 34HISEG   AT 80H ;从 IDATA 区的 80H 地址(为了避开 DATA 区)开始分配变量IEXAMPLEA:     DS   1 ;在 IDATA 区定义一个 1 字节的变量,地址为 80HIEXAMPLEB:     DS   4 ;在 IDATA 区定义一个 4 字节的变量,地址为 81HISEG   AT 255-NSTACKSIZE   ;将堆栈放在 IDATA 区的末尾,首地址为 255-NSTACKSIZEISTACK:       DS   NSTACKSIZE ;定义多字节变量,作为堆栈用(大小为 NSTACKSIZE),                    ; 见后面代码中的 “MOV   SP,#ISTACK”语句。XSEG   AT 00H   ;从 XDATA 区的 00H 地址开始分配变量XEXAMPLE0:     DS   1 ;在 XDATA 区定义一个 1 字节的变量,地址为 00HXEXAMPLE1:     DS   1 ;在 XDATA 区定义一个 1 字节的变量,地址为 01H;==============================================================================;;CODE 段  CSEG   AT 0   //程序起始地址A_START:  MOV   IE,#00H ;关闭中断  SJMP   A_MAIN  CSEG   AT 0023H   //串口中断地址,其它中断地址的指定类似此方法。  LJMP   A_UARTINT   //跳转到中断处理子函数;==============================================================================;A_MAIN:  MOV   SP,#ISTACK ;设置堆栈指针,              ;只能在调用任何函              ; 数之前设定SP。  MOV   PSW,#0 ;将RS0,RS1及其它标志位清0。;注意:内存清零不要放在子函数中,;     因为内存清零也会清零堆栈,;     从而导致 RET 返回地址不正确!!!  MOV   R0,#0FFH   ;内存00H~0FFH的内容清零。  CLR     AA_MAIN01:  MOV   @R0,A  DJNZ   R0,A_MAIN01;用户初始化代码...A_LOOP: ;主循环;用户代码  LCALL _TEST  SJMP   A_LOOP;用户代码(子程序)_TEST:  NOP  NOP  RETA_UARTINT: //串口中断处理子函数  NOP  NOP  RETI END

------------------------------------------------------------------------------------

A51

汇编器是运行于IBM PC系列及其兼容机上的交叉汇编软件,其主要功能是将MCS-51系列单片机汇编语言源程序翻译成符合Intel目标文件格式的可再定位的目标代码,经过L51连接器的连接和装配,产生可被DS51仿真器调试或其它任何一种与Intel 目标文件格式兼容的仿真器使用的绝对目标代码.

 

一:A51的符号:

在A51中可使用符号表示数值(EQU),地址和寄存器名,符号具有段类型,作用域,值域和可变性等属性.

 

符号的段属性:

指出符号所位于的地址空间.段类型有:

 

NUMBER       

无类型符号

 

DATA          DATA

段符号(可直接寻址的内部RAM空间)

 

IDATA         IDATA

段符号(可间接寻址的内部RAM空间)

 

XDATA         XDATA

段符号(外部数据存储空间)

 

BIT           BIT

段符号(内部RAM低地址区的可位寻址的空间)

 

CODE          CODE

段符号(程序存储器空间)

 

REGISTER     

寄存器符号

 

作用域:指出符号是外部的,局部的还是全局的.(PUBLIC,EXTRN

关键字说明)

 

二:标号:定义标号时,标号名后必须接冒号”:

”,以示区别,每行只能定义一个标号,标号一经定义,其值为当前地址计数器的当前值,因此标号代表了指令和数据的地址,不能重复定义.

 

三:特殊的汇编符号:A51

宏汇编语言定义了代表CPU寄存器的特殊符号,这些是保留的关键字,AR0---AR7:表示当前工作寄存器的R0—R7的绝对地址,它的值取决于指令所选择的工作寄存器组.

 

四:运算符:

有三种1):算术运算符包括:+,-(正负号),加---+,减,乘,除,MOD(取模),()—括号,改变运算顺序.2):二进制运算符号:用来对二进制数进行按位取反,移位或逻辑运算.包括:NOT(按位取反),HIGH(取右边操作数的高8位,LOW(取右边操作数的低8位)SHR(右移位),SHL(左移位),AND(逻辑与),OR(逻辑或),XOR(逻辑异或).3):关系运算符:>=,=,,



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3