伪指令用来对汇编程序进行控制.doc_第1页
伪指令用来对汇编程序进行控制.doc_第2页
伪指令用来对汇编程序进行控制.doc_第3页
伪指令用来对汇编程序进行控制.doc_第4页
伪指令用来对汇编程序进行控制.doc_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

伪指令用来对汇编程序进行控制,对程序中的数据实现条件转移、列表、存储空间分配等处理,其格式和汇编指令一样,但一般不产生目的代码,即不直接命令 CPU 去执行什么操作。伪指令是汇编语言的特色之一,具有两个基本特征: 1、伪指令是一条指令。它在程序中不是可有可无的,使用时受到严格的规范,与标准指令一样,在程序中占有固定的位置,有固定的书写格式。每条伪指令都与标准指令一样可实现特定的功能,伪指令是不能用标准指令替代的。 2、伪指令不是一条真正的指令,没有指令代码。在程序编译过程中,伪指令的功能会被实现,但伪指令会被删除,在编译后的目标文件中(目标文件一般是代码文件),不会有伪指令的编码。 也可以这样理解:指令是对计算机发出的命令,而伪指令则是对编译器发出的命令。在编译程序结束时,伪指令的使命就完成了。 伪指令是相对标准指令而言的,高级语言不存在伪指令,因为高级语言不存在指令,很难说明高级语言中哪一条语句是什么指令。 伪指令是为程序开发工程师提供辅助的程序表达,让编译器实现一些标准指令所不能表达的内容。 伪指令的作用: 1、程序定位的作用。把各程序段之间的相互关系和在存储器的位置告诉编译器。 2、为非指令代码进行定义。包括逻辑变量、字符和存储区等。 3、为程序完整性做标注。程序段的开始和结束。 4、有条件地引用程序段。比如条件循环、条件选择以及宏等。 在ARM处理器中,伪指令的应用和51系列的单片机很相似,它们除了把正常的程序用指令表达给计算机以外,还需要把程序设计者的意图表达给编译器。无论是51系列单片机还是ARM处理器,都需要定义数据以便编译器能够正确识别代码和数据,都可以引用宏,都可以为符号或变量赋值等。一、 定义数据伪指令 该类伪指令用来定义存储空间及其所存数据的长度。 DB :定义字节,即每个数据是 1 个字节。 DW :定义字,即每个数据占 1 个字 (2 个字节 ) 。 DD :定义双字,即每个数据占 2 个字。低字部分在低地址,高字部分在高地址。 DQ :定义 4 字长,即每个数据占 4 个字。 DT :定义 10 个字节长,用于压缩式十进制数,例如: DATA1 DB 5 , 6 , 8 , 100DATA2 DW 7 , 287TABLE DB ? ;表示在 TABLE 单元中存放的内容是随机的当一个定义的存储区内的每个单元要放置同样的数据时,可用 DUP 操作符。一般格式 : COUNT DUP (?), COUNT 为重复的次数,“()”中为要重复的数据。如: BUFFER DB 100DUP(0) ;表示以 BUFFER 为首地址的 100 个字节中存放 00H 数据BUFFER1 DB 100 DUP ( 3 , 5 , 2DUP ( 10 ), 35 ), 24 , NUM )想一想存储区的情况?二、 符号定义伪指令 EQU 、 = 、及 PURGE EQU 伪指令给符号定义一个值。在程序中,凡是出现该符号的地方,汇编时均用其值代替,如: TIMES EQU 50DATA DB TIMES DUP(?)上述两个语句实际等效于如下一条语句:DATA DB 50 DUP(?) “ = ”伪指令可给初始变量赋值。如: COUNT=100 ; COUNT=100TIME=50 ; TIME=50 PURGE 伪指令用于释放由 EQU 伪指令定义的变量,使这些变量可以被重新定义。PURGE TIMES ; 释放 TIMES 变量TIMES EQU 2 ; 重新定义三、段定义伪指令 SEGMENT 和 ENDS 一般来说,一个完整的汇编源程序由 3 个段组成,即堆栈段、数据段和代码段。段定义伪指令可将源程序划分成若干段,以便生成目的代码和连接时将各同名段进行组合。段定义伪指令一般格式为 :段名 SEGMENT 定位类型 组合类型 类别 段名 ENDSSEGMENT 和 END5 应成对使用,缺不可。其中段名是不可省略的。其它是可选项,是赋予段名的属性,可以省略。例如: DATA SEGMENTDW 20DUP(?)DATA ENDS四、 设定段寄存器伪指令 ASSUME 一般格式 : ASSUME 段寄存器:段名 ,段寄存器:段名, 功能 :通知汇编程序,哪一个段寄存器是该段的段寄存器,以便对使用变量或标号的指令汇编出正确的目的代码。在段名中, CODE 表示代码段, DATA 表示数据段, STACK 表示堆栈段。由于 ASSUME 伪指令只指明某一个段地址应存于哪一个段寄存器中,并没有包含将段地址送入该寄存器的操作。因此要将真实段地址装入段寄存器还需用汇编指令来实现。这一步是不可缺少的。例如, CODE SEGMENTASSUME CS : CODE , DS : DATA , SS : STACKMOV AX , DATA ; DATA 段值送 AXMOV DS , AX ; AX 内容送 DS , DS 才有实际段值CODE ENDS当程序运行时,由于 DOS 的装入程序负责把 CS 初始化成正确的代码段地址, SS 初始化为正确的堆栈段地址,因此用户在程序中就不必设置。但是,在装入程序中 DS 寄存器由于被用作其它用途,因此,在用户程序中必须用两条指令对 DS 进行初始化,以装入用户的数据段地址。当使用附加段时,也要用 MOV 指令给 ES 赋段地址。五、 定义过程的伪指令 PROC 和 ENDP 在程序设计中,可将具有一定功能的程序段看成为一个过程 ( 相当于一个子程序 ) ,它可以被别的程序调用。一个过程由伪指令 PROC 和 ENDP 来定义,其格式为 :过程名 PROC 类型 过程体RET过程名 ENDP其中过程名是为过程所起的名称,不能省略,过程的类型由 FAR (远过程,为段间调用)和 NEAR (近过程,在本段内调用)来确定,如果缺省类型,则该过程就默认为近过程。 ENDP 表示过程结束。过程体内至少应有一条 RET 指令,以便返回被调用处。过程可以嵌套,也可以递归使用。例如一个延时 100ms 的子程序,其过程可定义如下,DELAY PROCPUSH BXPUSH CXMOV BL , 10;延时 10ms ,改变 BL 和 CX 中的值,即可改变延时时间。AGAIN : MOV CX , 2801 ;WAIT ; LOOP WAITDEC BLJNZ AGAINPOP CXPOP BXRETDELAY ENDPCALL DELAY ;调用该过程远过程调用时被调用过程必定不在本段内。例如,有两个程序段,其结构如下:CODE1 SEGMENTASSUME CS : CODE1FARPROC PROC FARRETFARPROC ENDPCODE1 ENDSCODE2 SEGMENTASSUME CS : CODE2CALL FARPROC.CODE2 ENDSCODE1 段中的 FARPROC 过程被另一段 CODE2 调用,故为远过程。六、 宏指令 在汇编语言书写的源程序中,若有的程序段要多次使用,为了简化程序书写,该程序段可以用一条宏指令来代替,而汇编程序汇编到该宏指令时,仍会产生源程序所需的代码。宏指令的一般格式为 :宏指令名 MACRO 形式参量表 宏体ENDM例如: SHIFT MACROMOV CL , 4SAL AL , ClENDM这样定义以后,凡是要使 AL 中内容左移 4 位的操作都可用一条宏指令 SHIFT 来代替。宏指令与子程序有许多类似之处。它们都是一段相对独立的、完成某种功能的、可供调用的程序模块,定义后可多次调用。但在形成目的代码时,子程序只形成一段目的代码,调用时转来执行。而宏指令是将形成的目的代码插到主程序调用的地方。因此,前者占内存少,但执行速度稍慢;后者刚好相反。七、 ORG 伪指令 ORG 伪指令规定了在某一段内,程序或数据代码存放的起始偏移地址。一般格式 : ORG 例如: DATA SEGMENTBUFF1 DB 23 , 56H , EOF ORG 2000HBUFF2 DB STRING DATA ENDS上述变量定义中, BUFF1 从 DATA 段偏移地址为 0 的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论