您的位置 首页 芯闻

MCS-51单片机汇编伪指令的用法解析

MCS-51单片机汇编伪指令的用法解析-1、DS ---预留存储区命令

格式: 〔标号:〕 DS 表达式值

其功能是从指定地址开始,定义一个存储区,以备源程序使用。

存储区预留的存储单元数由表达式的值决定。

TMP: DS 1

从标号TEP地址处开始保留1个存储单元(字节)。

2、BIT---定义位命令

格式: 字符名称 BIT 位地址

其功能用于给字符名称定义位地址。

SPK BIT P3.7

经定义后,允许在指令中用SPK代替P3.7。

1、DS ---预留存储区指令

格局: 〔标号:〕 DS 表达式值

其功用是从指定地址开端,界说一个存储区,以备源程序运用。

存储区预留的存储单元数由表达式的值决议。

TMP: DS 1

从标号TEP地址处开端保存1个存储单元(字节)。

2、BIT---界说位指令

格局: 字符称号 BIT 位地址

其功用用于给字符称号界说位地址。

SPK BIT P3.7

经界说后,答应在指令顶用SPK替代P3.7。

MCS-51单片机汇编伪指令的用法解析

3、USING指令

USING指令告诉汇编器运用8051的哪一个作业寄存器组。

格局: USING 表达式 (值有必要为0-3,默许值为0。)

USING 0

运用第0组作业寄存器。

4、SEGMENT指令

SEGMENT 指令用来声明一个再定位段和一个可选的再定位类型。

格局: 再定位段名 SEGMENT 段类型〔再定位类型〕

其间,“再定位段名”用于指明所声明的段。

“段类型”用于指定所声明的段将处的存储器地址空间。

可用的段类型有 CODE、XDATA、DATA、IDATA和BIT。

STACK_SEG SEGMENT IDATA

DATA_SEG SEGMENT DATA

5、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 0000H

AJMP MAIN

7、ORG指令

ORG指令用来改动汇编器的计数器,然后设定一个新的程序开端地址。

格局: ORG 表达式

表达式有必要是肯定或简略再定位表达式。

ORG 0000H

AJMP MAIN

设定 MAIN 程序的开端地址为 0000H。

8、END指令

END指令用来操控汇编完毕。在每个汇编程序的最终一行有必要有一条END指令,

并且END指令只能呈现一次。

9、EQU指令

EQU 指令用于将一个数值或寄存器名赋给一个指定的符号名。

格局: 符号名 EQU 表达式

或 符号名 EQU 寄存器名

表达式有必要是一个简略再定位表达式。

用 EQU 指令赋值今后的字符名,能够用作数据地址、代码地址、位地址或许

直接作为一个当即数运用。

LIMIT EQU 1200

COUNT EQU R5

10、DATA 指令

DATA 指令用于将一个内部 RAM 的地址赋给指定的符号名。

格局: 符号名 DATA 表达式

数值表达式的值在 0-255 之间,表达式有必要是一个简略再定位表达式。

PORT1 DATA 40H

11、DB 指令

DB 指令以表达式的值的字节办法初始化代码空间。

格局: [标号:] DB 表达式表

表达式中可包括符号、字符串、或表达式等项,各个项之间用逗号离隔,字符串运用引号括起来。

括号内的标号是可选项,假如运用了标号,则标号的值将是表达式表中榜首字节的地址。

DB 指令有必要坐落 CODE 段之内,不然将会发生过错。

TABLE:

DB 0C0H, 0F9H, 0A4H

TABLE1:

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 字节的变量,地址为 08H

DTEST: DS 1 ;在 DATA 区界说一个 1 字节的变量,地址为 0AH

DLCDBUFFER: 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 字节的变量,地址为 30H

DBYTED: DS 3 ;在 DATA 区界说一个 3 字节的变量,地址为 31H

DBYTEE: DS 1 ;在 DATA 区界说一个 1 字节的变量,地址为 34H

ISEG AT 80H ;从 IDATA 区的 80H 地址(为了避开 DATA 区)开端分配变量

IEXAMPLEA: DS 1 ;在 IDATA 区界说一个 1 字节的变量,地址为 80H

IEXAMPLEB: DS 4 ;在 IDATA 区界说一个 4 字节的变量,地址为 81H

ISEG AT 255-NSTACKSIZE ;将仓库放在 IDATA 区的结尾,首地址为 255-NSTACKSIZE

ISTACK: DS NSTACKSIZE ;界说多字节变量,作为仓库用(巨细为 NSTACKSIZE),

; 见后边代码中的 “MOV SP,#ISTACK”句子。

XSEG AT 00H ;从 XDATA 区的 00H 地址开端分配变量

XEXAMPLE0: DS 1 ;在 XDATA 区界说一个 1 字节的变量,地址为 00H

XEXAMPLE1: 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 A

A_MAIN01:

MOV @R0,A

DJNZ R0,A_MAIN01

;用户初始化代码

。。.

A_LOOP: ;主循环

;用户代码

LCALL _TEST

SJMP A_LOOP

;用户代码(子程序)

_TEST:

NOP

NOP

RET

A_UARTINT: //串口中止处理子函数

NOP

NOP

RETI

END

本文引证地址: http://www.21ic.com/app/mcu/201901/786307.htm

————————————————————————————

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):联系运算符:》=,《=,《》,=,《,》。

一切运算符的优先级次序:()àNOT,HIGH,LOWà+,-(正负号)à*,/,MODà+,-(加减)àSHR,SHLàAND,OR,XORà

》=,《=,《》,》,《,=。

数值表达式:

数值表达式由运算符和操作数组成,一个操作数又能够是表达式,与符号具有段特点相同,表达式也具有段类型特点,表达式的类型依赖于操作数的类型。表达式的类型如下:BIT,NUMBER,CODE,DATA,IDATA,XDATA.大多数的表达式是无类型的,当表达式中包括有段类型的操作数或许是子表达式时,运算成果的段类型遵从下面的准则:

关于单目运算符:(+/-/HIGH/LOW/NOT)表达式的成果与操作数具有相同的类型

关于一切的双目运算符(除+/-),表达式的成果均为无类型的成果

对加减运算,只有当其间的一个操作数具有段类型的时分,运算成果才具有相同的段类型,假如两个操作数具有段类型,即便他们的段类型相同,成果也是无类型的

(NUMBER)。

总结:只有当操作数加上或许是减去一个无类型时,才或许发生一类型,其他一切的组合均发生无类型的表达式

A51供给了伪指令,

能够使用这些伪指令在汇编程序中界说符号,保存和初始化存储空间,定位方针代码等功用,伪指令中除DB,DW外均不发生方针代码,但能够改动汇编器的状况,并将有关信息(如段界说)加到方针文件中。

伪指令分四类

1):界说符号:SEGMENT,EQU,SET,DATA,IDATA,XDATA,BIT,CODE

2):

保存和初始化存储空间:DS,DB,DW,DBIT

3):程序链接:

PUBLIC,EXTRN,NAME

4):

汇编状况操控和段挑选

:ORG,

END,RSEG,CSEG,DSEG,XSEG,ISEG,BSEG,USING

一 :界说符号的伪指令

1

)SEGMENT

格局: 段名符号 SEGMENT 段类型 [再定位类型]

SEGMENT

指令可声明一个可再定位(差异于CSEG,DSEG,XSEG,BSEG,ISEG等 界说的在相对应的空间固定地址界说的肯定段—在衔接的过程中不答应从头定位)的段符号和一个可选的再定位类型,段符号能够用来界说段,L51衔接器可将多个模块内的具有相同段名和再定位类型的几个段组成为一个段。段类型阐明晰段所在的地址空间。

假如是编写的汇编程序要与C源程序接口,即被C源程序调用,则悉数的汇编子程序所命名的界说的代码段的段名有必要是可用SEGMENT来界说的,并且姓名的命名的办法也应该参照C51编译器发生的部分段的段名的转换规矩。段名的效果主要是在汇编的时分用RSEG来激活的,在衔接定位的时分用到的。与段名相应的是用于存储和传递参数的别号,能够在汇编源程序中直接运用部分段的别号,这个别号主要是在传递函数参数的时分用的。在汇编程序中要用PUBLIC 声明被其他模块引证的大局符号。

DATA (

可直接寻址的内部RAM空间)

IDATA (

可直接寻址的内部RAM空间)

XDATA (

外部数据存储空间)

BIT (

内部RAM低地址区的可位寻址的空间)

CODE (

程序存储器空间)

可选的再定位类型界说了L51衔接时的定位办法,再定位类型

UNIT:

界说一个可开端于任一单元的段关于BIT型的段,一个单元是一个位,

其它一切的段一个单元是一个字节

PAGE:

界说一个开端地址有必要是256的整数倍的段,段的肯定地址由L51自己核算,该类型只答运用于XDATA和CODE类型段。

INPAGE:

界说一个由L51衔接后有必要包括在256B的块中,只适用于XDATA和CODE段。

INBLOCK:

界说一个L51衔接后有必要包括在2KB中的段,只适用于CODE段。

OVERLAYABLE:界说一个可与其他段交叠的掩盖段,其段名符号有必要按C51或许PL/M51的规矩命名.C51把部分数据段和部分位段界说成?DT?FUNCTIONNAME?MODULENAME和?BI?FUNCTIONNAME?MODULENAME这是在small形式下。其他的形式略有不同。

BITADDRESSABLE:

界说一个L51衔接后坐落可位寻址的区,段长不能超过16B.

2) EQU

格局: 符号名 EQU 表达式

符号名 EQU 寄存器名

EQU

伪指令界说一表明数值或寄存器的符号,该符号可用于表达式或助记符指令的操作数,EQU指令界说的符号不能被改动或从头界说,其段类型取决于表达式中的操作数类型类型,无类型的EQU符号可用于任何表达式中。

LIMIT EQU 200

VALUE EQU LIMIT-100+’A’

COUNTER EQU R5

3) SET

格局: 符号名 SET 表达式

符号名 SET 寄存器名

SET

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/news/xinwen/346106.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部