《[信息与通信]伪指令》由会员分享,可在线阅读,更多相关《[信息与通信]伪指令(33页珍藏版)》请在金锄头文库上搜索。
1、 常用伪指令 SPMC65 汇编伪指令与汇编指令不同,它不会被 CPU 执行,而是在汇编器对程序进行汇编期间实现对汇编器的控制。使用伪指令可以完成分配存储区、定义宏、指导汇编器汇编指定的代码等功能,从而增加程序的可读性和可维护性。 SPMC65 伪指令的语法格式及分类 SPMC65 伪指令可以出现在程序文件的任意位置,为了与汇编指令区分,建议伪指令的前面加上一个句点“ . ”,例如“ .CODE ”。 SPMC65 伪指令不必区分字母的大小写,也就是说,在 SPMC65 程序中,“ .code ”、“ .CODE ”、“ .cODe ”是等价的,建议伪指令全部大写。但是利用伪指令定义的标号(包
2、括段名、宏名、变量名、结构名等)则要区分其字母的大小写,例如标号“ Temp ”与标号“ temp ”代表两个不同的标号。 为便于对 SPMC65 伪指令的语法进行描述,我们采用了下列符号约定: lable 标号 count 数量 value 常量数值 args 参数 可缺省项目。如果出现 的形式,则表示可缺省项的内容本身就带有方括号。 SPMC65 伪指令依照其用途可分为五类:存储类、定义类、条件类、汇编链接类以及调试类。详见 表 2.86 。表中用斜线“ / ”隔开的伪指令是同义伪指令,它们虽然名字不同,但实现的功能是相同的。例如“ ORG/ORGIN ”表示 ORG 与 ORGIN 两条
3、伪指令可以相互替换。 表 2 . 86 伪指令分类列表 类别 用途 伪指令 存储类 定义变量和常量 DB / BYTE / DEFB / STRING , DW / DEFW / WORD , DD / LONG , FLOAT , DOUBLE , DS / DEFS , DUP , ASCII , BLKB , BLKL , BLKW 定义类 标号定义 段定义 过程和结构的定义 宏定义 VAR / DEFL / SET 、 EQU / EQUAL CODE , DATA , PAGE0 , SECTION , ORG / ORGIN PROC , ENDP , STRUCT , ENDST
4、 MACRO , ENDM / MACEND , MACEXIT 条件类 对汇编指令进行条件汇编 IF / IFN / IFNFALSE / IFNZ / IFTRUE , IFE / IFFALSE / IFNTRUE / IFZ , IFDIFF / IFNSAME 、 IFNDIFF / IFSAME , IFDEF , IFNDEF , IFMA , IFNMA , IFABS / IFNREL , IFNABS / IFREL , IFSSEQ , IFSSNEQ , IFPAGE0 , IFNPAGE0 , IFCLEAR , IFNEXT , ELSE , ENDIF / END
5、C , EXIT 汇编链接类 指导汇编器和连接器 PUBLIC / GLOBAL / XDEF , EXTERN / EXTERNAL / XREF , INCLUDE , LINKLIST , SYMBOLS , COMMENT , ASK , MESSAGE / MESSG , ABSOLUTE , RELATIVE , END 调试类 与调试相关的伪指令 STABF , STABN , STABS 下面将分类介绍比较常用的伪指令。 存储类伪指令 1. DB 功能 以字节型数据的形式来存储常量(定位在 ROM 区,参见 .CODE 伪指令) 同义伪指令 DEFB 、 BYTE 、 STRI
6、NG 格式 label: .DB count value ,count value, 说明 本伪指令把一系列 8 位常量值存入连续的数据单元中。多个 value 值用逗号分隔开,也可在每个 value 值的前面指定一个 count 值,表示连续存储 count 个相同的 value 。如果存储的常量中含有 ASCII 字符或字符串,则必须用单引号或双引号将其括起来。 例如: Lb1: .DB 17h ;1 个字节,值为 17h .DB 3,2d,ef ;5 个字节,值为 3,d,d,e,f Lb3: .DB “Isnt” ; 包含单引号的字符串 上述定义将使汇编器分配一段 ROM 空间用来存储
7、这些数值: 初值 17h 3 d d e f I s n 单引号 t ROM 区存储内容 17h 03h 64h 64h 65h 66h 49h 73h 6Eh 27h 74h 如果利用 .DB 定义变量(在 RAM 区存储,参见 .PAGE0 和 .DATA 伪指令),那么 .DB 后面的初始化值将不起作用,汇编器仅仅在 RAM 中分配相应长度的空间,而不会存入初值,因此不建议使用 .DB 定义变量。 2 DW 功能 以 16 位整型数据的形式来存储常量(定位在 ROM 区,参见 .CODE 伪指令) 同义伪指令 DEFW 、 WORD 格式 label: .DW count value ,
8、count value, 说明 本伪指令将申请若干连续的 16 位整型数据单元来存储双字节型常量序列。其使用方法与 .DB 伪指令相同。 例如: Lb1: .DW 1074h ;1 个双字节,值为 1074h .DW 3,2d,ef ;5 个双字节数据 上述定义将使汇编器分配一段 ROM 空间用来存储这些数值: 初值 1074h 3 d d e f ROM 区存储内容 74h 10h 03h 00h 64h 00h 64h 00h 65h 00h 66h 00h 如果利用 .DW 定义变量(在 RAM 区存储,参见 .PAGE0 和 .DATA 伪指令),那么 .DW 后面的初始化值将不起作用
9、,汇编器仅仅在 RAM 中分配相应长度的空间,而不会存入初值。不建议用 .DW 定义变量。 3. DD 功能 以 32 位长整型数据的形式来存储常量(定位在 ROM 区,参见 .CODE 伪指令) 同义伪指令 LONG 格式 label: .DD count value,value, 说明 本伪指令申请若干连续的 32 位长整型数据单元来存储四字节型常量。其使用方法与 .DB 伪指令相同。 例如: Lb1: .DD 123456h ; 占用 1 个 32 位单元 .DD 3,2d,ef ; 占用 5 个 32 位单元 上述定义将使汇编器分配一段 ROM 空间用来存储这些数值: 初值 12345
10、6h 3 d ROM 区存储内容 56h 34h 12h 00h 03h 00h 00h 00h 65h 00h 00h 00h 初值 d e f ROM 区存储内容 65h 00h 00h 00h 66h 00h 00h 00h 67h 00h 00h 00h 如果利用 .DD 定义变量(在 RAM 区存储,参见 .PAGE0 和 .DATA 伪指令),那么 .DD 后面的初始化值将不起作用,汇编器仅仅在 RAM 中分配相应长度的空间,而不会存入初值。不建议用 .DD 定义变量。 4. FLOAT 功能 以单精度浮点型实数的形式来存储常量(定位在 ROM 区,参见 .CODE 伪指令) 格式
11、 label: .FLOAT count value,value, 说明 本伪指令用来把实数常量转换为 IEEE 格式表示的单精度浮点型数据并存储,每个浮点数将占用 4 字节的存储空间。 .FLOAT 的使用方法与 .DB 伪指令相同。同样地,只用当利用 .FLOAT 定义常量时, value 预置的初值才会起作用,而定义的变量(存储于 RAM 区,参见 .PAGE0 和 .DATA 伪指令)不会被相应的 value 值初始化,仅仅会占用同样大小的 RAM 空间,因此不建议用 .FLOAT 定义变量。 例如: Lb1: .FLOAT 134.576 ; 将 134.576 转换为 IEEE 格
12、式( 43069375h ) .FLOAT 278 ; 将两个 78 转换为 IEEE 格式( 429C0000h ) 上述对常量的定义将使汇编器分配一段 ROM 空间用来存储这些数值: 初值 134.576 78 78 ROM 区存储内容 75h 93h 06h 43h 00h 00h 9Ch 42h 00h 00h 9Ch 42h 5. DOUBLE 功能 以双精度浮点型实数的形式来存储常量(定位在 ROM 区,参见 .CODE 伪指令) 格式 label: .DOUBLE count value,value, 说明 本伪指令用来把实数常量值转换为 IEEE 格式表示的双精度浮点型数据并存
13、储,每个浮点数将占用 8 字节的存储空间。 .DOUBLE 的使用方法与 .DB 伪指令相同。同样地,只用当利用 .DOUBLE 定义常量时, value 预置的初值才会起作用,而定义的变量(在 RAM 区存储,参见 .PAGE0 和 .DATA 伪指令)仅会占用同样大小的 RAM 空间,不会被相应的 value 值初始化。不建议用 .DOUBLE 定义变量。 例如: Lb1: .DOUBLE 134.576 ; 转换为 IEEE ( 4060D26E978D4FDFh ) 若上述定义处于常量区,那么将占用一段 ROM 空间用来存储这些数值: 初值 DFh 4Fh 8Dh 97h 6Eh D2
14、h 60h 40h ROM 区存储内容 134.576 6. DUP 功能 与 .DB 、 .DW 、 .DD 、 .FLOAT 、 .DOUBLE 等常量存储类伪指令配合使用,用来存放若干个具有相同数值的常量。 格式 label: .DB count .DUP (value) label: .DW count .DUP (value) label: .DD count .DUP (value) label: .FLOAT count .DUP (value) label: .DOUBLE count .DUP (value) 说明 本伪指令将分配 count 个值为 value 的数据单元,
15、如果 value 值为问号( ? ),则 value 值被初始化为 0 。 例如: Lb1: .DW 11 DUP (20h) / 定义 11 个字的连续空间,并存入 20h DUP 伪指令可以灵活地出现在存储类伪指令中,例如: Lb1: .DB 5, 21, 3 .DUP (?), 2 .DUP (7,8), 2 .DUP (ab) 上述常量定义将在 ROM 中分配空间来存储下列数值: 初值 5 21 3 .DUP (?) 2 .DUP (7,8) 2 .DUP (ab) ROM 区存储内容 05h 01h 01h 00h 00h 00h 07h 08h 07h 08h 61h 62h 61h 62h 7. DS 功能 定义指定长度的变量(定位在 RAM 区,参见 .PAGE0 和 .DATA 伪指令)。 同义伪指令 DEFS 格式 label: .DS count 说明 本伪指令用来为变量分配一段 RAM 空间, count 代表这段空间占用的字节数。利用 .DS 分配的变量空间不会被初始化,其中的数据是不确定的。建议定义变量使用 D