文档详情

汇编伪指令详解

ji****72
实名认证
店铺
DOC
97KB
约17页
文档ID:39649981
汇编伪指令详解_第1页
1/17

51 汇编伪指令伪指令是对汇编起某种控制作用的特殊命令,其格式与通常的操作指令一样,并可加在汇编程序的任何地方,但它们并不产生机器指令许多伪指令要求带参数,这在定义伪指令时由“表达式”域指出,任何数值与表达式匀可以作为参数不同汇编程序允许的伪指令并不相同,以下所述的伪指令仅适用于MASM51系统,但一些基本的伪指令在大部份汇编程序中都能使用,当使用其它的汇编程序版本时,只要注意一下它们之间的区别就可以了MASM51中可用的伪指令有:ORG 设置程序起始地址END 标志源代码结束EQU 定义常数SET 定义整型数DATA 给字节类型符号定值BYTE 给字节类型符号定值WROD 给字类型符号定值BIT 给位地址取名ALTNAME 用自定义名取代保留字DB 给一块连续的存储区装载字节型数据DW 给一块连续的存储区装载字型数据DS 预留一个连续的存储区或装入指定字节INCLUDE 将一个源文件插入程序中TITLE 列表文件中加入标题行NOLIST 汇编时不产生列表文件NOCODE 条件汇编时,条件为假的不产生清单一、一、ORG 伪指令 ORG 用于为在它之后的程序设置地址值,它有一个参数,其格式为:ORG 表达式表达式可以是一个具体的数值,也可以包含变量名,如果包含变量名,则必须保证,当第一次遇到这条伪指令时,其中的变量必须已有定义(已有具体的数值),否则,无定义的值将由 0 替换,这将会造成错误。

在列表文件中,由 ORG 定义的指令地址会被打印出来ORG 指令有什么用途呢?指令被翻译成机器码后,将被存入系统的ROM中,一般情况下,机器码总是一个接一个地放在存储器中,但有一些代码,其位置有特殊要求,典型的是五个中断入口,它们必须被放在 0003H,000BH,0013H,001BH 和 0023H 的位置,否则就会出错,如果我们编程时不作特殊处理,让机器代码一个接一个地生成,不能保证这些代码正好处于这些规定的位置,执行就会出错,这时就要用到 ORG伪指令了看如下例子:例:INT_0 EQU 1000HTIME_0 EQU 1010HINT_1 EQU 1020HTIME_1 EQU 1030HSERIAL EQU 1040HAJMP START ;跳转到主程序起始点LJMP INT_0 ;外中断0处理程序LJMP TIME_0 ;定时中断0处理程序LJMP INT_1 ;外中断1处理程序LJMP TIME_1 ;定时中断1处理程序LJMP SERIAL ;串行口中断程序START:NOPEND上面的程序经汇编后列表文件如下:The Cybernetic Micro Systems 8051 Family Assembler, Version 3.03 Page 108-26-961000 = INT_0 EQU 1000H1010 = TIME_0 EQU 1010H1020 = INT_1 EQU 1020H1030 = TIME_1 EQU 1030H1040 = SERIAL EQU 1040H0000 0111 AJMP START ;跳转到主程序起始点0002 021000 LJMP INT_0 ;外中断0处理程序0005 021010 LJMP TIME_0 ;定时中断0处理程序0008 021020 LJMP INT_1 ;外中断1处理程序000B 021030 LJMP TIME_1 ;定时中断1处理程序000E 021040 LJMP SERIAL ;串行口中断程序START:0011 00 NOP0000 ENDThe Cybernetic Micro Systems 8051 Family Assembler, Version 3.03 Page 208-26-96;%T Symbol Name Type ValueINT_0 . . . . . . . . . . . . . I 1000INT_1 . . . . . . . . . . . . . I 1020SERIAL. . . . . . . . . . . . . I 1040START . . . . . . . . . . . . . L 0011TIME_0. . . . . . . . . . . . . I 1010TIME_1. . . . . . . . . . . . . I 1030;%Z00 Errors (0000)由列表文件,可以绘出代码在ROM中的映象图如下:代码 01H 11H 02H 10H 00H 02H 10H 10H 02H 10H 20H 地址 00H 01H 02H 03H 04H 05H 06H 07H 08H 09H 0AH 代码 02H 10H 30H 02H 10H 40H 00H 地址 0BH 0CH 0DH 0EH 0FH 10H 11H 12H 13H 14H 15 由上面的映象图可知,在03H处的代码为10H,而不是我们要的02H,所以外断程序INT_0不能被正确执行,其它各中断程序的情况同样如此,如在0BH处,本来存放的应当是定时器0中断程序,但按上述的映象图,0BH处开始的3个代码是:02H,10H,30H,这是定时器1的入口地址,所以,如果定时器0发生中断,所执行的其实是定时器1的中断程序,这当然不对。

例2:INT_0 EQU 1000HTIME_0 EQU 1010HINT_1 EQU 1020HTIME_1 EQU 1030HSERIAL EQU 1040HAJMP START ;跳转到主程序起始点ORG 0003HLJMP INT_0 ;外中断0处理程序ORG 000BHLJMP TIME_0 ;定时中断0处理程序ORG 0013HLJMP INT_1 ;外中断1处理程序ORG 001BHLJMP TIME_1 ;定时中断1处理程序ORG 0023HLJMP SERIAL ;串行口中断程序START:NOPEND上面的程序经过汇编后列表文件如下:The Cybernetic Micro Systems 8051 Family Assembler, Version 3.03 Page 108-26-961000 = INT_0 EQU 1000H1010 = TIME_0 EQU 1010H1020 = INT_1 EQU 1020H1030 = TIME_1 EQU 1030H1040 = SERIAL EQU 1040H0000 0126 AJMP START ;跳转到主程序起始点0003 ORG 0003H0003 021000 LJMP INT_0 ;外中断0处理程序000B ORG 000BH000B 021010 LJMP TIME_0 ;定时中断0处理程序0013 ORG 0013H0013 021020 LJMP INT_1 ;外中断1处理程序001B ORG 001BH001B 021030 LJMP TIME_1 ;定时中断1处理程序0023 ORG 0023H0023 021040 LJMP SERIAL ;串行口中断程序START:0026 00 NOP0000 ENDThe Cybernetic Micro Systems 8051 Family Assembler, Version 3.03 Page 208-26-96;%T Symbol Name Type ValueINT_0 . . . . . . . . . . . . . I 1000INT_1 . . . . . . . . . . . . . I 1020SERIAL. . . . . . . . . . . . . I 1040START . . . . . . . . . . . . . L 0026TIME_0. . . . . . . . . . . . . I 1010TIME_1. . . . . . . . . . . . . I 1030;%Z00 Errors (0000)由列表文件,可以绘出代码在ROM中的映象图如下:代码 01H 11H 02H 10H 00H 地址 00H 01H 02H 03H 04H 05H 06H 07H 08H 09H 0AH 代码 02H 10H 10H 02H 01H 20H 地址 0BH 0CH 0DH 0EH 0FH 10H 11H 12H 13H 14H 15H 代码 02H 10H 30H 地址 16H 17H 18H 19H 1AH 1BH 1CH 1DH 1EH 1FH 20H 代码 02H 10H 40H 00H 地址 21H 22H 23H 24H 25H 26H 27H 28H 29H 2AH 2BH 由映象图可知,各中断程序的代码都在其规定地址处,一旦产生中断即可执行相应的程序。

至于图中未填的部分(如 02H),根据各编程器不同而不同,一般为 FFH或 00H 二、二、END END 语句标志源代码的结束,汇编程序遇到 END 语句即停止运行若没有 END 语句,汇编将报错END 语句有一个参数,可以是数值 0,也可以是表达式,其格式是:标号: END 表达式它的值就是程序的地址并且作为一个特殊的记录写入 HEX 文件若这个表达式省略,HEX 文件中其值就是 0三、三、EQU EQU 以及其它一些符号定义伪指令用来给程序中出现的一些符号赋值对这些符号名的要求与其它符号相同,即长度不限,大小写字母可互换并且必须以字母开头由等值指令定义的符号是汇编符号表的一部分等值伪指令有两种形式一种用EQU,另一种用字符“=”即符号名 EQU 表达式符号名 = 表达式两种形式的效果是一样的符号名在左边,其对应的值在右边值可以是变元,其它的符号名或表达式只要在两遍扫描中求出表达式的值就行,否则引用该符号名时将报错当表达式的值是字符串时,只取后两个字符若串长为 1,高位字节被置0,符号名的值被打印在程序清单中由等值伪指令定义的符号名不允许重名如果经定义的符号名被重定义,则汇编将报出错,并且这个符号名按新定义的处理,最好不要在程序中出现重名。

例:0469= ABC EQU 469H0464= XY EQU ABC-502F0= JK = 7520754 XYJK = XY+JK在列表文件中最左边的数字不是这些伪指令所在的地址而是通过汇编后赋给符号名的值第一条符号名 ABC 被起来 469H,第二条 XY 被赋于 ABC-5,因此 XY 的值为 469H-5=464H,JK 的值为 752(即 2F0H),XYJK 的值 XY+JK=464H+2F0H=754H四、四、SET SET 伪指令有些类似于等值伪指令,它定义了一个整数类型的符号名,它的格式为符号名 SET 表达式SET 伪指令与等值伪指令的唯一区别在于 SET 伪指令所定义的符号名右以在程序中多次定义,而不报错例:002D= K57 SET 101101B8707= K57 SET 34567五、五、DATA 与与 BYTE DATA 与 BYTE 都是用来定义字节类型的存储单元,赋予字节类型的存储单元一个符号名,以便在程序中通过符号名来访问这个存储单元,以帮助对程序的理解BYTE 与 DATE 之间的区别类似于 EQU 和 SET,BYTE 伪指令不能定义重名六、六、WORD WORD 伪指令类似于 DATE 伪指令,只是 WORD 伪指令定义了一个字类型的符号名,其格式为:符号名 WORD 表达式0027= VAL31 WORD 390021= PAR7 WORD 21H一个字由2个字节组成。

当然,因为8051汇编语言集没有字操作,所以程序执行时,只处理字节WROD伪指令仅仅允许用户定义一个认为是字的存储位置七、七、BIT BIT 伪指令定义了一个字位类型的符号名,其格式为:符号名 BIT 表达式这里表达式的值是一个位地址,这个伪指令有助于位的地址符号化例:002F= LOG3 BIT 4。

下载提示
相似文档
正为您匹配相似的精品文档