汇编语言程序格式、伪指令
- 格式:pdf
- 大小:315.99 KB
- 文档页数:68


汇编常见伪指令
汇编常见伪指令
转⾃:
⼀、与宏有关的伪指令
在宏定义时,为了满⾜某种特殊需要,汇编语⾔还提供了⼏个伪指令。 9.3.1 局部标号伪指令LOCAL
在宏定义体中,如果存在标号,则该标号要⽤伪指令LOCAL说明为局部标号,否则,当在源程序中,有多于⼀次引⽤该宏时,汇编程序在进⾏宏扩展后将会给出:标号重复
定义的错误。
伪指令LOCAL的⼀般格式如下: LOCAL 标号1, 标号2, ……
伪指令LOCAL必须是伪指令MACRO后的第⼀条语句,并且在MACRO和LOCAL之间也不允许有注释和分号标志。
汇编程序在每次进⾏宏扩展时,总是把由LOCAL说明的标号⽤⼀个唯⼀的符号(从??0000到??FFFF)来代替,从⽽避免标号重定义的错误。
例9.7 编写求⼀个求绝对值的宏。
解:
⽅法1: ABSMACROword1
CMPword1, 0
JGEnext
NEGword1
next:
ENDM
假设对宏ABS有以下两次引⽤,点击它们将会显⽰汇编程序对它们进⾏宏扩展后所得到程序⽚段:
ABS BX
1 CMP BX, 0
1 JGE next
1 NEG BX
1 next: …
ABS AL
1 CMP AL, 0
1 JGE next
1 NEG AL
1 next:
在上述程序⽚段中,显然标号next定义了⼆次,所以,汇编程序将显⽰“标号重复定义”的错误信息。为了避免这种情况的发⽣,我们需要⽤下⾯的⽅法来定义该宏。
⽅法2: ABSMACROword1
LOCALnext
CMPword1, 0
JGEnext
NEGword1
next:
ENDM
假设对宏ABS有以下两次引⽤,点击它们将会显⽰汇编程序对它们进⾏宏扩展时所得到程序⽚段:
ABS BX
1 CMP BX, 0
1 JGE ??0000
1 NEG BX
1 ??0000: …
ABS AL
ASM-51汇编伪指令
一、 伪指令分类 1. 符号定义 SEGMENT, EQU, SET, DATA, IDATA, XDATA, BIT, CODE 2. 存储器初始化/保留 DS, DB, DW, DBIT 3. 程序链接 PUBILC, EXTRN, NAME 4. 汇编程序状态控制 ORG, END 5. 选择段的伪指令 RSEG, CSEG, DSEG, XSEG, ISEG, BSEG, USING 二、 伪指令具体说明 1. 符号定义伪指令 1) SEGMENT伪指令 格式:段名 SEGMENT 段类型 说明:SEGMENT 伪指令说明一个段。段就是一块程序代码或数据存储器。 允许使用的段类型为: ●CODE代码空间 ●DATA 可以直接寻址的内部数据空间 ●XDATA外部数据空间 ●IDATA可以间接寻址的整个内部数据空间 ●BIT位空间 例子:(段符号用于表达式时,代表被连接段的基地址) STACK SEGMENT IDATA RSEG STACK DS 10H ;保留16字节做堆栈 MOV SP , #STACK-1 ;堆栈指针初始化 2) EQU伪指令 格式: 符号名 EQU 表达式 符号名 EQU 特殊汇编符号 说明:EQU表示把一个数值或特殊汇编符号赋予规定的名字。 一个表达式赋予一个符号,必须是不带向前访问的表达式。 例子:N27 EQU 27; ACCUM EQU A ;定义ACCUM代替特殊汇编符号A(累加器) HERE EQU $; HERE为当前位置计数器的值 3) SET伪指令 格式: 符号名 SET 表达式 符号名 SET 特殊汇编符号 说明:SET类似EQU,区别在于可以用另一个SET伪指令在以后对定义过的符号重新定义。 例子:COUNT SET 0 COUNT SET COUNT+1 4) BIT伪指令 格式: 符号名 BIT 位地址 说明: BIT伪指令把一个地址赋予规定的符号名。该符号类型取段类型BIT. 例子: RSEG DATA_SEG; CONTROL: DS 1 ALATM BIT CONTROL.0; OPEN_BOARD BIT ALATM+1 ;下一位 RESET_BOARD BIT 60H ;下一个绝对的位 5)DATA伪指令 格式: 符号名 DATA 表达式 说明: DATA伪指令把片内的数据地址赋予所规定的符号名。符号段类型为DATA. 例子:CONIN DATA SBUF;定义CONIN 到串行口缓冲器的地址 TABLE_BASE DATA 70H ;把TABLE_BASE 定义到位置70H 6)XDATA伪指令 格式: 符号名 XDATA 表达式 说明: XDATA伪指令把片外的数据地址赋予所规定的符号名。段类型为XDATA. 例子: RSEG XSEG1 ORG 100H DATE DS 5;定义DATE在偏离XSEG1的100H处 TIME XDATA DATE+5;定义TIME为DATE后面的5个字节. 7)IDATA伪指令 格式: 符号名 IDATA 表达式 说明: IDATA伪指令将间接的内部数据地址赋予所规定的符号名。类型为IDATA. 例子:BUFFER IDATA 60H BUFFER_LEN EQU 20H BUFFER_END IDATA BUFFER+BUFFER_LEN-1 8)CODE伪指令 格式: 符号名 CODE 表达式 说明: CODE 伪指令把一个代码地址赋予所规定的符号名。符号段类型为CODE。 2. 存储器初始化及保留 1)DS伪指令 格式: 标号 DS 表达式 说明: DS伪指令以字节为单位保留空间。可以用于除BIT类型段以外的任何段。 2)DBIT伪指令 格式: 标号 DBIT 表达式 说明: DBIT伪指令以位为单位保留空间。它仅用于BIT类型段。在BIT段中,位置计数器的基本单位是位而不是字节。 3)DB伪指令 格式: 标号 DB 表达式 说明:DB伪指令用字节值对代码存储器初始化。段类型为CODE型,其表达式列表是一个由逗号(,)分开的一个或多个字节值或串。 例子:AGE: DB ‘MARY’,0,27 ORIMES:DB 1,2,3,5 4)DW伪指令 格式: 标号 DW 表达式 说明: DW伪指令是用字(16位)值对代码存储器初始化。段类型为CODE型。该表达式可以是一个由逗号(,)分开的一个或多个字值,字值可为绝对的或可重新定位的表达式。若在列表中用了位置计数器$,它计算出正被初始化字的代码地址。列表中的每一项以它出现在该列表中的顺序放入存储器,其高字节在前,低字节在后。 例子:ARRIVAL DW 710, ‘AM’ JUMP_TABLE DW GO_PROC,BREAK_PROC,DISPLAY_PROC;由产生地址的清单成一个跳转表。 3. 程序的链接 1) PUBLIC伪指令 格式:PUBLIC 符号名列表 说明:PUBLIC伪指令允许当前被汇编模块的符号为外部公用。符号名对于一个时,用逗号(,)分开。寄存器或段符号名(通过SEGMENT伪指令声明了的)不可以规定为PUBLIC。 例子:PUBLIC putctrl,put_data,liner 2) EXTRN伪指令 格式:ERTRN [段类型(符号名列表)],。。。 说明:EXTRN伪指令列出当前模块中要访问的在其他模块中定义了的符号。这个伪指令可以出现在程序的任何地方。外部符号必须符合与上每一个符号相关的段类型。(这些类型是CODE,XDATA,DATA,IDATA,BIT及NUMBER,即一个无类型的符号) 例子:EXTRN CODE(pntcrif,putstring,getnum),DATA(count,total) EXTRN CODE(binas,ascbin),NUMBER(table-size) 3) NAME 伪指令 格式: NAME 模块名 说明:NAME伪指令用来定义当前的程序模块,应放在该模块全部伪指令及指令代码的前面。若无NAME伪指令,则源文件名作为系统对其设置的名称,但不得以数字开始。 4. 汇编程序的状态控制 1) END 格式: END 说明:END语句不得有标号,允许在它的行上出现一个注释。END语句是程序的最后一行,否则将产生一个错误。 2) ORG 格式: ORG 表达式 说明:ORG伪指令用来对汇编程序的位置计数器做修改,以设置一个新的程序起点。该表达式应当是一个绝对的或是可重新定位的表达式,它访问当前的段而不含向前的访问。 ORG伪指令改变位置计数器,但它并不产生一个新段。如果当前段为绝对段,其值便是当前段的一个绝对地址,如果该段是可以重新定位的,其值是当前段基地址的偏移。 例子:ORG ($+10H) AND 0FFF0H ;将位置计数器设为下一个16字节边界 ORG 50 :将位置计数器设置为50 5. 段选择伪指令 可重定位段:RSEG 格式:RSEG 段名 说明:其段名一定要在前面使用SEGMENT伪指令定义过 绝对段: CSEG XSEG DSEG ISEG BSEG 格式: ●CSEG [ AT 绝对地址] ;在代码地址空间选择一个绝对段 ●XSEG [ AT 绝对地址] ;在外部数据地址空间选择一个绝对段 ●DSEG [ AT 绝对地址] ;在内部数据地址空间选择一个绝对段 ●ISEG [ AT 绝对地址] ;在间接内部数据地址空间选择一个绝对段 ●BSEG [ AT 绝对地址] ;在位地址空间选择一个绝对段 如果使用[ AT 绝对地址],汇编器便结束以前规定的绝对段并生成一个从该地址开始的新的绝对段。如果未规定一个绝对地址,该段类型的原来绝对段便继续生效。如果选择段类型为以前未定义的绝对段而且省略了绝对地址,则在位置0开始生成一个段。 例子: BSEG AT 70H DECIMAL_MODE DBIT 1 CHAT_MIDE DBIT 1 6. USING伪指令 格式: USING 表达式 说明: USING伪指令通知汇编器其后面的代码所使用的寄存器组。其表达式是一个数(0-3之间),它指向四个寄存器组之一。 例子: USING 3 PUSH AR2 ;压入第三组的第二个寄存器 USING 1 PUSH AR2 ;压入第一组的第二个寄存器 51单片机汇编指令详解 指令格式 功能简述 字节数 周期
5.2 汇编语言源程序的格式
在第四章介绍指令系统时曾给出若干程序举例,但是,它们仅仅是一些程序片段,并不是完整规范的汇编语言源程序。下而给出一个比较简单,然而比较规范的汇编语言源程序。
例5.1 要求将两个五字节16进制数相加,可以编写出以下汇编语言源程序。
DATA SEGMENT ;定义数据段
DATA1 DB 0F8H,60H,0ACH,74H,3BH ;被加数
DATA2 DB 0C1H,36H,9EH,0D5H,20H ;加数
DATA ENDS ;数据段结束
CODE SEGMMENT ;定义代码段
ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA
MOV DS,AX ;初始化DS
MOV CX,5 ;循环次数送CX
MOV SI,0 ;置SI初值为0
CLC ;清CF标志
LOOPER:MOV AL,DATA2[SI] ;取一个字节加数
《汇编语⾔》学习笔记6——伪指令
1.伪指令⼜称伪操作,即不能像汇编指令⼀样⽣成可执⾏的⼆进制机器代码,⽽是在汇编程序对汇编语⾔源程序进 ⾏汇编(编译)期间,由汇编程序执⾏。它与C中的说明性语⾔的含义类似,起到说明作⽤,⽤来指出程序分段、数据定义、存储分配、程序开始和结束等信息,这些信息在汇编(编译)完成后就不⽤了。但程序中没伪指令,则系统就⽆法完成编译。2.段定义伪指令:⽤来定义各种类型的段
1.格式:段名 SEGMENT [类型参数] ...... 段名 ENDS
1.其中SEGMENT和ENDS必须成对出现,表⽰段的开始和结束。⼀般的,段名和段的意义⼀致,便于识别。
2.段名实际就是段地址,在汇编过程中,系统给出具体的地址值,⼀个段必须有⼀个名字来标识。
3.参数是可选项(可有可⽆),⽤于指出段的边界、段的组合、类别标识,⼀般⽤于多模块程序设计中。
2.类型参数
1.定位类型
PARA 该段的起始地址必须为⼩段的⾸地址,即起始地址的16进制数最低位为0
BYTE 该段可以从任意地址开始
WORD 该段必须从字边界开始,即起始地址为偶数
DWORD 该段必须从双字边界开始,即起始地址的16进制数为最低应为4的倍数
PAGE 该段必须从页边界开始,即起始地址的16进制数最低两位为00(能被256整除)
若不指定定位类型,系统默认为PARA
2.组合类型
PRIVATE 该段为私有段,连接时不与其他同名段合并
PUBLIC 连接时可与其他模块中的同名段按顺序连接成⼀个段
COMMON 表⽰该段与其他模块中的同名段有相同的起始地址,如果连接将产⽣覆盖,连接后段的长度为同名段中的最长者
STACK 表⽰该段为堆栈段
AT 表达式 该段直接定位在表达式指出的位置上
若不指定组合类型,默认为PRIVATE 3.类型标识:在引号中给出段的类型名。在连接时,类别标识相同的段放在连续的存储区中。(如:"STACK"⽤啦标识该段为堆栈段)