第三章汇编程序设计基础 (2)_第1页
第三章汇编程序设计基础 (2)_第2页
第三章汇编程序设计基础 (2)_第3页
第三章汇编程序设计基础 (2)_第4页
第三章汇编程序设计基础 (2)_第5页
已阅读5页,还剩88页未读 继续免费阅读

下载本文档

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

文档简介

1、汇编语言程序设计汇编语言程序设计北京理工大学北京理工大学 电子工程系电子工程系马永锋马永锋第三章第三章 汇编语言程序组织汇编语言程序组织3.1 汇编语言源程序组织结构汇编语言源程序组织结构3.2 汇编语言的语句汇编语言的语句3.3 汇编语言的数据组织及其访问汇编语言的数据组织及其访问3.4 汇编语言程序正常结束的方式汇编语言程序正常结束的方式3.5 汇编语言运行及调试环境汇编语言运行及调试环境每一种语言都有一定的格式要求,汇编语言对源程序也有严格的格式每一种语言都有一定的格式要求,汇编语言对源程序也有严格的格式要求。只有源程序格式书写正确,汇编程序才能将其汇编、连接形成机要求。只有源程序格式书

2、写正确,汇编程序才能将其汇编、连接形成机器指令程序。器指令程序。汇编语言源程序由汇编语句组成,这些语句不仅包括由汇编指令构成汇编语言源程序由汇编语句组成,这些语句不仅包括由汇编指令构成的指令语句,还包括变量定义说明语句,以及各种伪指令语句。的指令语句,还包括变量定义说明语句,以及各种伪指令语句。3.1 汇编语言源程序组织结构汇编语言源程序组织结构 汇编语言对源程序有严格的格式要求,格式正确汇编程序才汇编语言对源程序有严格的格式要求,格式正确汇编程序才能准确地翻译源程序,形成等价的机器指令。能准确地翻译源程序,形成等价的机器指令。汇编语言程序格式就是汇编语言必须遵守的语法规则,它有汇编语言程序格

3、式就是汇编语言必须遵守的语法规则,它有两种书写形式两种书写形式:完整段定义:完整段定义:完整段定义是一种标准的汇编语言书写形式,也是传统的书写形式,它适完整段定义是一种标准的汇编语言书写形式,也是传统的书写形式,它适用于所有版本的汇编语言,可使程序设计者对汇编程序实行全面控制;用于所有版本的汇编语言,可使程序设计者对汇编程序实行全面控制;既适用于将要生成的既适用于将要生成的EXE文件对应的源程序的格式也适用于将要生成的文件对应的源程序的格式也适用于将要生成的COM文件对应的源程序的格式文件对应的源程序的格式简化段定义:简化段定义:是一种快捷的段定义方式。是一种快捷的段定义方式。3.1.1 完整

4、段定义格式完整段定义格式完整段定义格式的汇编程序框架完整段定义格式的汇编程序框架 ; filename.asm.;用EQU定义的等价语句区(可有可无).;若有外部模块,用EXTRN定义外部说明STACK SEGMENT ;定义堆栈段STACK . ;分配堆栈段的大小STACK ENDS ;堆栈段结束DATA SEGMENT ;定义数据段DATA .;定义数据DATA ENDS ;数据段结束CODE SEGMENT ;定义代码段 ASSUME CS:CODE,DS:DATA,SS:STACK ;确定CS/DS/SS指向的逻辑段START: MOV AX,DATA MOV DS,AX;装填数据段寄

5、存器 .;程序代码 MOV AX,4C00H ;结束程序,返回DOS功能调用 INT 21HCODE ENDS ;代码段结束 . ;子程序代码 END START ;汇编结束,程序起始点为START3.1.1 完整段定义格式完整段定义格式完整段定义格式的汇编程序框架完整段定义格式的汇编程序框架 任何一个源程序有至少一个逻辑代码段和一条作为源程序文件结束的伪指令任何一个源程序有至少一个逻辑代码段和一条作为源程序文件结束的伪指令END;逻辑数据段根据程序本身功能的要求可有可无,也可以有多个;逻辑数据段根据程序本身功能的要求可有可无,也可以有多个;逻辑堆栈段可有可无,也可有多个,如果没有,那么连接时

6、将产生一个警告逻辑堆栈段可有可无,也可有多个,如果没有,那么连接时将产生一个警告性的错误,这对于没有堆栈操作的用户程序来说并不是错误,但如果用户程序性的错误,这对于没有堆栈操作的用户程序来说并不是错误,但如果用户程序用到堆栈的话,则最好设置自己的逻辑堆栈段。用到堆栈的话,则最好设置自己的逻辑堆栈段。 完整段定义伪指令完整段定义伪指令 (1)SEGMENT/ENDS 定义逻辑段伪指令定义逻辑段伪指令格式:格式: SEGMENT 定位类型定位类型组合类型组合类型寻址方式寻址方式类别类别 ENDS功能:功能:为任何一个逻辑段命名,并指出以该段名命名的逻辑段的起止。为任何一个逻辑段命名,并指出以该段名

7、命名的逻辑段的起止。 段名是由用户自己给出的,每一对段名是由用户自己给出的,每一对SEGMENT/ENDS前的段名必须保持一致,前的段名必须保持一致,通常都写成通常都写成CODE、DATA、STACK等。如果用户不写段名,则汇编时将自动等。如果用户不写段名,则汇编时将自动为其加上一个段名:为其加上一个段名:?SEG。在通常情况下,一个段的长度不能超过在通常情况下,一个段的长度不能超过64K,在,在80386及其以后系统的保护及其以后系统的保护方式下,段基地址是方式下,段基地址是32位,段的最大长度可达位,段的最大长度可达4G。完整段定义伪指令完整段定义伪指令类型说明BYTEBYTE表示段的起始

8、地址可以是以字节为单位的,即任何地址均可WORDWORD表示段的起始地址是以字为单位的,即段址为偶数,用二进制表示最低一位是0DWORDDWORD表示段的起始地址是以双字为单位的,即一定是4的倍数,用二进制的形式表示最低两位是0PARAPARA表示段的起始地址是以节为单位的,即为16的倍数,用二进制表示低4位是0PAGEPAGE表示段是从页的边界开始的,段址是256的倍数,用二进制表示低8位均为0定位类型定位类型用来指示各段起始边界的性质,如下表所示,可以有5种,缺省时是PARA类型。完整段定义伪指令完整段定义伪指令组合类型组合类型用来描述连接时各段间的关系,有6种类型,如下表所示。类型类型说

9、明说明ATAT表达式表达式连接程序把本段装在表达式的值所指定的地址上,这样可直接对内存操作,但程序代码段不能用AT指定PRIVATEPRIVATE缺省的设置方式缺省的设置方式,表示本段与其他逻辑段没有关系,每段均各自设置地址PUBLICPUBLIC连接程序把所有同名的PUBLIC段邻接存放,这样同名的段可以连接在一起形成一个更大的段,段的总长度是所有同名段的长度和,但段的总长度不能超过64KBCOMMONCOMMON连接程序把所有同名同类别的COMMON段指向共同的段址,因而各段相互重叠。段的总长度是同名段中最长的段所具有的长度。当几个程序是共同设计一个大软件时,对于某个相同的数据段可以设置成

10、COMMON类型,这样各个模块均可在自己的程序中对该COMMON段方便地寻址;另一种方法是用EXTRN或EXTERN设置外部变量,但数据多时并不方便MEMORYMEMORY连接程序把本段定位在所有段的上面,即程序的最高地址处。如有多个MEMORY段,则遇到的第一个是MEMORY段,其他的作COMMON段处理STACKSTACK连接程序把所有的STACK段连接成一个堆栈段完整段定义伪指令完整段定义伪指令寻址方式寻址方式主要用于80386,它可以设置为USE16或USE32,分别代表16位寻址和32位寻址,当处理器是80386时,对于80386保护模式缺省为USE32,其他模式缺省为USE16。对

11、于8086和80286,由于不具备32位寻址能力,只能是16位寻址,所以不用设置这一项。类别,可以是任何名字,用引号括起来,连接时用于组成段组名。属于一个给定类的所有段均被安放在一个内存邻接块中,而不管其在源模块中的顺序如何。 完整段定义伪指令完整段定义伪指令(2)ASSUME 定义寻址关系伪指令格式:格式:ASSUME :,功能:功能:出现在代码段中可执行的汇编指令之前,用以说明相应的逻辑段应通过相应的段寄存器寻址(包括变量与标号)。因为逻辑段名由用户自己给出,编译器不知道各个段名是什么段,以致在寻址时不知相对偏移地址是在哪一个段中,所以用ASSUME伪指令来通知编译器需要寻址的段将会用什么

12、段寄存器(CS、DS、SS、ES)来寻址,如 ASSUME CS:CODE,DS:DATA,SS:STACK但是这不是对段寄存器的装填,完整段定义时,段寄存器必须通过段名来装填。段名经过汇编、连接和操作系统装入后就是一个具体的段地址常数,即段名是一个立即数,应借助通用寄存器AX来实现段寄存器的装填。在ASSUME语句中,还可以用关键字NOTHING来说明某个段寄存器不与任何段相对应。下面语句说明了段寄存器ES不与某段相对应。在代码段的其它位置,还可以用另一个ASSUME语句来改变前面ASSUME语句所说明的对应关系,这样,代码段中的指令就用最近的ASSUME语句所建立的对应关系来确定指令中的有

13、关信息。完整段定义伪指令完整段定义伪指令(3)END 结束伪指令格式:格式: END 标号|过程名功能:功能:表示源程序到此为止,汇编程序对该语句之后的任何内容都不作处理,通常情况下,伪指令END是源程序的最后一条语句。END后面可附带一个在程序中已定义的标号,该标号指明程序的启动位置。如果源程序是一个独立的程序或主模块,那么伪指令END后面一定要附带一个标号;如果源程序仅是一个普通模块,那么其END后面就一定不能附带标号。 (4)EQU 等价语句伪指令格式:格式: EQU 功能:功能:以后遇此标识符则等效于表达式的值或字符串。其中标识符应是字母打头的字母数字串(字母包括英文字母和特殊符号?、

14、和下横线_),长度应不大于31。表达式的特例可以是常数。例如: ABC EQU 123;该程序的代码中ABC就是常数123 MOVE EQU MOV ;该程序的代码中MOVE AX, BX等效于MOV AX, BX DEF EQU 2*3;该程序的代码中DEF就是常数6 完整段定义伪指令完整段定义伪指令(5)等号)等号= 伪指令格式:格式:=功能:功能:“=”给标识符定义一个数值。 例如: X=10 X=X+10注意:注意:EQU用于给标识符定义一个数值时不能重复定义标识符,但“=”允许重复赋值。(6) EXTRN 定义外部说明伪指令格式:格式:EXTRN 其中外部名说明是指本程序文件所用到的

15、外部模块中的过程名、标号或变量名。功能:功能:供连接程序,遇到相应外部名时从其他模块去寻找。 完整段定义伪指令完整段定义伪指令(7)GROUP 合并伪指令格式:格式: GROUP , 功能:功能:将两个段合并成一个段。有时用户需要不断地访问两个数据段,且都要用DS来寻址,这就要不断地装填数据段寄存器DS,显然这是很麻烦的。一个简单的办法就是用GROUP伪指令将这两个段合并成一个段,这样两个段就可以相对于同一个段寄存器进行寻址了。这时,ASSUME语句应把DS设置成指向该段组。(8)PROC/ENDP 定义过程伪指令格式:格式: PROC ENDP功能:功能:定义过程的起始和结束。PROC和EN

16、DP必须成对出现。关于堆栈段定义关于堆栈段定义在源程序中,可用以下方法来定义堆栈段。方法1:Stack1SEGMENTDB256 DUP(?);256是堆栈的长度,可根据需要进行改变TOPLABEL WORDStack1ENDS 由于堆栈是按地址从大到小的存储单元顺序来存放内容的,所以,在堆栈存储单元说明语句之后,再说明一个栈顶别名,这样,对SP的赋值就很方便。 在源程序中,还要添加如下程序段,才能把段Stack1当作堆栈段来使用。ASSUME SS:STACK1;可在代码段的段指定语句中一起说明CLI;禁止响应可屏蔽中断MOVAX, STACK1MOVSS, AXMOVSP, offset

17、TOP;给堆栈段的栈顶寄存器SP赋初值STI;恢复响应可屏蔽中断关于堆栈段定义关于堆栈段定义方法2:STACK1SEGMENT STACK;定义一个堆栈段,其段名为STACK1DB256 DUP(?)STACK1ENDS 上述段定义说明了该段是堆栈段,系统会自动把段寄存器SS和栈顶寄存器SP与该堆栈段之间建立相应的关系,并设置其初值,而不用在代码段对它们进行赋值。完整段定义完整段定义举例举例举例:举例:用DOS 9号功能在显示器上输出字符串Hello World源程序如下:DATA SEGMENT ;定义数据段DATAHW DB Hello world,13,10,$ ;定义数据DATA EN

18、DS ;数据段结束CODE SEGMENT ;定义代码段ASSUME CS:CODE,DS:DATA ;确定CS/DS指向的逻辑段START:MOV AX,DATA MOV DS,AX ;装填DS寄存器 MOV DX,OFFSET HW ;DX指向串首 MOV AH,9 ;DOS 9号功能调用 INT 21H ;显示指定字符串 MOV AX,4C00H ;结束程序返回DOS功能调用 INT 21HCODE ENDS ;代码段结束 END START ;汇编结束,程序起始点为START;显示字符串使用DOS 9号功能,该功能要求DS:DX指向字符串首。3.1.2 简化段定义格式简化段定义格式简化

19、段定义格式的汇编程序框架简化段定义格式的汇编程序框架 TITLE COMMENT *这是一个简化段定义框架实例,说明如何用简化段定义编写汇编程序*.MODEL SMALL ;定义程序的存储模式.STACK nH ;定义堆栈段,其中n为以字节为单位的栈长 ;需要写具体值,如10个字的堆栈,n应该写为14H.DATA ;定义数据段 . ;定义数据.CODE ;定义代码段START: MOV AX,DATA MOV DS,AX ;装填数据段寄存器 . ;程序代码 MOV AX,4C00H INT 21H ;程序结束点,返回DOS . ;子程序代码 END START ;汇编结束,程序起始点为标号ST

20、ART处简化段定义伪指令简化段定义伪指令 简化段定义伪指令在说明一个新段开始的同时,也说明了上一个段的结束。(1)TITLE 置标题伪指令 格式:格式: TITLE 在TITLE后第一个非空字符之后的字符串就是程序的标题,标题只出现在程序清单文件中,以提高程序的清晰度,该指令在程序中并不是必需的。除TITLE外,还有PAGE等涉及源程序清单格式的一些伪指令,这里不介绍。(2)MODEL 内存模式伪指令 格式:.MODEL MODEL伪指令用来指定该汇编程序所使用的内存模式,内存模式说明了程序中的数据及代码的缺省长度,且使用简化段定义的程序必须用MODEL指出内存模式。各种内存模式的含义如下表所

21、示。 简化段定义伪指令简化段定义伪指令 存储模型存储模型功能功能适用操作系统适用操作系统TinyTiny最小模式最小模式所有数据和代码都放在一个64K的段内,访问都为NEAR型,并会产生.COM文件MS-DOSSmallSmall小模式小模式代码在一个64KB段中,数据在另一个64KB段中,通常编写的汇编程序使用小模式就已经足够了MS-DOSWindowsMediumMedium中模式中模式代码可以大于64KB,转移或调用可为FAR型,但数据只能在一个单一的64KB段中MS-DOSWindowsCompactCompact紧凑模式紧凑模式代码在一个单一的64KB段中,转移或调用可为NEAR型,

22、而数据可以大于64KBMS-DOSWindowsLargeLarge大模式大模式代码和数据都可以大于64KB但任何数组不能大于64KB,数据和代码的访问类型都是FAR型MS-DOSWindowsHugeHuge特大模式特大模式代码和数据都可以大于64KB,数组也可以超过64KBMS-DOSWindowsFlatFlat平展模式平展模式所有代码和数据放置在一个段中,但段地址是32位的,所以整个程序可为4GB。MASM 6.0支持该模型OS/2WindowsNT简化段定义伪指令简化段定义伪指令 (3).STACK定义堆栈段伪指令格式:格式:.STACK 功能功能: .STACK定义堆栈段的开始,其

23、中,可以不写,其缺省值为1024B。(4).DATA定义数据段伪指令 格式:格式:.DATA功能:功能:.DATA定义数据段的开始,一个源程序可以有多个伪指令.DATA定义的数据段,这就好像在源程序中定义多个同段名的数据段一样。还有两个很少使用的伪指令来定义数据段 .DATA? / .CONST,这两条伪指令在与高级语言编写的程序相结合时为了遵守高级语言的某些约定而需要特殊说明时才使用。 伪指令.DATA?说明下面是一个未初始化数据段的开始;伪指令.CONST说明下面是一个常数数据段的开始。简化段定义伪指令简化段定义伪指令 (5).CODE 定义堆栈段伪指令格式:格式:.CODE功能功能: .

24、CODE定义代码段的开始。(6)END 定义数据段伪指令 格式:格式:END 功能:功能:表示源程序到此结束。(7)COMMENT 成片注释伪指令格式格式:COMMENT * 注释 *功能:功能:COMMENT是一个成片注释的伪指令,从其后的第一个非空字符开始是注释,直到遇到同样的非空字符结束。本框架中*就是这个注释的起始和结束符。(8););的作用程序中出现的分号;,表示注释的开始,从分号后直到换行均为用户的注释。适当的注释可增加程序的可读性,经常添加注释是一种优良的程序设计风格,也使得程序更加容易维护。简化段定义举例简化段定义举例 举例:用DOS 9号功能在显示器上输出字符串Hello W

25、orld。源程序如下:TITLE EX5-1COMMENT* 这是一个简化段定义程序实例*.MODEL SMALL ;定义存储器类型.STACK 100H ;定义堆栈段.DATA ;定义数据段HW DB Hello World,13,10,$.CODE ;定义代码段START: MOV AX,DATA MOV DS,AX ;装填数据段寄存器MOV DX,OFFSET HW ;DX指向串首 MOV AH,9 ;DOS 9号功能调用INT 21H ;显示指定字符串MOV AH,4CH ;结束程序返回DOS功能调用INT 21HEND START ;汇编结束 3.2 汇编语言的语句汇编语言的语句可以

26、将汇编语言的语句归纳为可以将汇编语言的语句归纳为4种类型:种类型:(1)伪指令)伪指令 伪指令又称为伪操作,它是程序源代码在汇编期间由汇编器识别和执行的指令,可以完成如处理器选择、定义程序模式、定义数据、分配存储区、指定程序结束等功能,除了定义数据及分配存储区为指令分配存储器空间外,其他伪指令不生成目标码。 伪指令是汇编语言的保留字,不能够用来命名变量名或标号。(2)汇编指令)汇编指令(3)变量定义说明语句)变量定义说明语句(4)注释)注释(1)变量定义伪指令)变量定义伪指令格式:格式: 变量类型说明 | 功能:功能:为变量定义、分配内存并为其置初值。(1)变量名)变量名变量名与标号、过程名一

27、样,必须是一个汇编非保留字的标识符,而且在同一程序中的定义是唯一的;最多由31个字符组成,可以包括字母(AZ)、数字(09)和专用字符(?、 、-、),但是不能以数字开头,如果名字中用到“”则必须是第一个字符。注意,汇编语言不区分大小写。无论是变量名还是标号或过程名。它们都用来表示本语句的符号地址。变量名可有可无,如果没有只能通过其在相应段中的位移来确定和访问。只有已经命名的变量,才能够在其说明的程序中通过变量名访问,访问时变量名的实质是相对于所在段的位移。变量定义变量定义伪指令伪指令(2)变量类型说明)变量类型说明变量类型说明可以是:DB、DW、DD、DF、DQ 或DT,它们都是变量存储方式

28、的说明。DB(define byte)用来定义字节,其后的每个数据都以字节的方式存储。DB能定义十进制数、二进制数、八进制数、十六进制数和ASCII字符,二进制数、八进制数和十六进制数要分别用“B”、“Q”和“H”表示,ASCII字符用单引号( )或双引号(“ ”)括起来。DB还是唯一能定义字符串的伪操作,串中的每个字符占用一个字节。例如:A DB 1000001B,101Q,41H,65汇编后这里变量A,A+1,A+2,A+3分别按字节存放着01000001 变量定义变量定义伪指令伪指令(2)变量类型说明)变量类型说明DW(define word)用来定义字,其后的每个数据分配两个字节(1个

29、字),数据的低8位存储在低字节地址中,高8位存储在高字节地址中。DD(define double word)用来定义双字,其后的每个数据分配4个字节(两个字)。该伪指令同样将数据转换为十六进制,并根据低地址存储低字节,高地址存储高字节的规则来存放数据。DQ(define quad word)伪指令用来定义4字,即64位字长的数据,DQ之后的每个数据占用8个字节(4个字)。DT(define ten bytes)用来为压缩的BCD数据分配存储单元,它虽然可以分配10个字节(5个字),但最多只能输入18个数字,要注意的是,数据后面不需要加“H”。 变量定义变量定义伪指令伪指令(3)表达式和表达式表

30、)表达式和表达式表这里的表达式可以是常数、变量、可以求值的算术式、字符串、?、DUP子句、变量等。表达式表表达式表是由逗号分隔的若干个表达式。其中“?”用来保留存储空间,但不预置初始数据。采用DUP重复子句定义的变量可以看成数组。以下举例分别说明。 ;表达式为常数,如:;表达式为常数,如:A DB 100;A为一个字节,初值为100B DB 100,2*3;B值100,B+1值为6C DW 2*3 ;C为一个字,值为06H,00H;表达式为字符串,用单引号括起来如:;表达式为字符串,用单引号括起来如:D DB ABCD ;D值为41H、D+1值为42H,D+2值为43H,D+3 值为44HE

31、DW AB,CD ;按BADC的ASCII顺序存放,即42H, 41H,44H,43H 变量定义变量定义伪指令伪指令;表达式为?保留存储空间,如:;表达式为?保留存储空间,如: F DB ?;F为一个字节,值不定G DW ?;G为一个字,值不定;表达式为;表达式为DUP子句,格式子句,格式 n DUP ( 操作数),如:操作数),如:H DB 100 DUP (0) ;H为具有100个元素的字节数组,每个元素值为0I DB 3 DUP (1,2 DUP(0);9个数顺序为:1,0,0,1,0,0,1,0,0J DB 5 DUP (Hello,0DH,0AH);分配35个字节值为HelloCRC

32、F重复5次 K DW 256 DUP(?) ;K为具有256个元素的字数组,元素值不定;表达式为已定义的变量,如:;表达式为已定义的变量,如:L DW K ;L中存放K在段中的位移 M DD K ;M的低字存放K在段中的位移,高字存放K所在的段基地址(2)LABEL伪指令伪指令格式格式: LABEL 功能:功能:为下一个存储单元起一个名字并定义它的类型。说明:说明:对于变量,其类型可以是BYTE/WORD/DWORD等;对于标号,其类型可以是NEAR/FAR。LABEL伪指令并不为名字分配空间,但它可以为下一个存储单元另起名字而且另定义它的类型,从而可以使同一个地址具有不同类型的名字,便于引用

33、。举例:举例:REDEW LABEL WORDDEBYTE DB 25H,32H,56H,42HMOV BL, DEBYTE ;对DEBYTE 按字节访问,(BL)=25H;MOV CX, REDEW ;对REDEW按字访问,(CX)=3225H(3)符号定义伪指令)符号定义伪指令等值伪指令等值伪指令 EQU 格式格式: EQU 功能:功能:用符号名代表表达式或表达式的值。说明:说明:表达式可以是任何有效的操作数格式,如常数、数值表达式、另一符号名或助记符。注意用EQU定义的符号在同一个程序中不能再定义。举例:举例:;先定义下列符号先定义下列符号 CR EQU 0DHBEL EQU 07HPO

34、RTA EQU 60HB EQU BP+6 ;在程序中引用在程序中引用MOV AL, CR ;AL=0DH, 增加程序可读性MOV AL, BEL;AL=07HADD BL, B ;(BL)=(BL)+(SS:BP+6)缩短了书写长度IN AL,PORTA; 便于修改符号定义伪指令符号定义伪指令EQU与与$配合使用,得到变量分配的字节数配合使用,得到变量分配的字节数例如:例如:MSG DB This is first string.COUNT EQU $-MSGMOV CL, COUNT ;(CL)=MSG的串长21 等号伪指令等号伪指令 格式格式: 功能:用符号名代替数值表达式的值功能:用符

35、号名代替数值表达式的值。说明:说明: 等号伪指令与EQU伪指令功能相似,其区别是:等号伪指令的表达式只能是常数或数值表达式;用“”定义的符号在同一个程序中可以再次定义;通常在程序中用“”定义常数。(4)对准伪指令)对准伪指令 格式格式:EVEN功能:定位到偶地址功能:定位到偶地址。说明:说明:根据80 x86的硬件技术,最好的存储空间分配应该是:字型数据从字边界(偶地址)开始存放,双字数据从双字边界(4的整数倍)开始存放,这样便于在一个总线周期访问数据。举例:ORG 50HA1 DB 3 ;(50H)=03EVENA2 DW 5 ;(52H)=05, (53H)=00(5)结构伪指令)结构伪指

36、令格式格式: STRUC ;数据定义伪指令序列 功能:功能:定义一种结构。说明:说明:3.3汇编语言操作符汇编语言操作符在汇编语言中,不仅有各种类型的运算符,还有许多操作符。通过运算符、操作符及括号把常数和符号连起来,就得到表达式。表达式分为数值表达式和地址表达式。数值表达式是指在汇编过程中能够由汇编程序计算出数值的表达式 (1)算术运算操作符)算术运算操作符(2)逻辑操作符)逻辑操作符(3)关系操作符)关系操作符(4)返回值操作符)返回值操作符(5)属性操作符)属性操作符(1)算)算术术运算操作符运算操作符算术操作符有+(加)、(减)、*(乘)、/(除)、MOD(取模)。其中/(除)表示整除

37、即只取商,而 MOD只取余数,如19/7的值是2,而19 MOD 7的值则为5(余数)。算术操作符可以用在数值表达式或地址表达式中,用于地址表达式时,要注意只有当其结果有明确的物理意义时才是有效的。例如:FIRST+1是指紧跟FIRST单元之后的单元地址,不是FIRST的内容加1。举例:X DW 12,34,56CT EQU ($-X)/2 MOV CX,CT; (CX)=3 MOV AX, X ADD AX,X+2; (AX)=46(2)逻辑操作符)逻辑操作符逻辑操作符有AND(逻辑与)、 OR(逻辑或)、 XOR(逻辑异或 )和NOT(逻辑非),另外还有左移位(SHL)和右移位(SHR)。

38、逻辑运算的结果是数值,只能用在数值表达式中。这些操作符与逻辑指令助记符的表示方法和操作相同,但它们的执行时间不同,前者在汇编过程中执行,后者在程序执行时执行。例如:MOV AX, 1 SHL 3 ;将表达式1 SHL 3 的结果8送入AXADD CX, 256 SHR 2;将表达式256 SHR 2的结果64加到CX又如:PORT EQU 0FH AND DL, PORT AND 0FEH汇编后,该指令为 AND DL, 0EH(3)关系操作符)关系操作符关系操作符有EQ (相等)、 NE (不等)、 LT (小于)、 GT (大于)、 LE(小于或等于)、 GE (大于或等于)。关系操作的结

39、果是逻辑值(真/假),若关系成立,则结果为真0FFFFH,关系不成立,则结果为假0000H。例如: MOV AX, 1234 GT 1024 ;将关系运算的结果 0FFFFH送入AX MOV BX, 1234 LT 1024;将关系运算的结果0送入BX(4)返回值操作符返回值操作符这组操作符可以把一些特征或内存单元地址的组成部分作为数这组操作符可以把一些特征或内存单元地址的组成部分作为数值返回值返回 SEG 功能:返回变量或标号的段基地址。功能:返回变量或标号的段基地址。OFFSET 功能:返回变量或标号的偏移地址。功能:返回变量或标号的偏移地址。 TYPE 功能:根据其后变量或标号不同功能:

40、根据其后变量或标号不同若变量类型为若变量类型为 DB/ DW/ DD/ DF/ DQ/ DT,则分别返回,则分别返回 1/ 2/ 4/ 6/ 8/ 10;若用结构定义,则返回该结构占用的字节数;若用结构定义,则返回该结构占用的字节数;若为若为NEAR型标号,则返回型标号,则返回1;若为;若为FAR型标号,则返回型标号,则返回2.返回值操作符返回值操作符LENGTH 功能:返回由功能:返回由 DUP格式定义的变量的长度格式定义的变量的长度n,其它情况,其它情况返回值为返回值为1。SIZE 功能:返回变量所占的字节数,只对由功能:返回变量所占的字节数,只对由 DUP格式定义的格式定义的变量有实际意

41、义。变量有实际意义。SIZE= LENGTH*TYPE。$ 返回地址计数器的当前值返回地址计数器的当前值返回值操作符举例返回值操作符举例VAR DW 50 DUP (A)ARY DW 4,5,6COUNT EQU $ - OFFSET ARY ;COUNT=6MOV AX, SEG VAR ;AX=VAR的段基址MOV DS, AXADD SI, TYPE ARY ;(SI)=(SI)+2MOV CX, LENGTH VAR ;(CX)=50MOV CX, SIZE VAR ; (CX)=100MOV CX, LENGTH ARY ; (CX)=1MOV CX, SIZE ARY ; (CX)

42、=2(5)属性操作符)属性操作符为了提高访问变量的灵活性,可以使用修改属性的操作符,来达到临时按指定属性操作的目的。修改变量类型操作符修改变量类型操作符PTR格式:格式: PTR 说明:说明:其中类型可以是BYTE,WORD,DWORD,地址表达式可以是用变量名给出的有效地址、其他形式的有效地址,或能给出一个地址的表达式。功能:功能:在使用这一操作符的指令中,临时按指定类型操作。例如: BUF DB 31H, 32HMOV AL, BUF ;(AL)=31HMOV BX, WORD PRT BUF ;(BX)=3231H LEA DI, BUFMOV BYTE PRTDI,6 ;明确指出DI指

43、向字节型单元INC WORD PTRBX+SI ;类型不知道,必须明确指出访问形式,明确按字访问属性操作符属性操作符段的修改段的修改格式:格式: :功能:功能:临时指定该有效地址相对指定段寻址。例如:例如: MOV BX,SS:SI+3 ;SI临时相对SS变址 MOV BX,DATA2:WORD PTR100;将DATA2逻辑段中位移100的一个字送入BX中 双重定义变量名双重定义变量名格式:格式:EQU THIS DB|DW|DD|功能功能:为存储器操作数指定类型。该操作数地址与下一个存储单元具有相同的段基址和偏移量。说明:说明:它并不为该存储器操作数分配空间,与LABEL伪指令有相似之处,

44、它们的区别是出现的位置不同。LABEL是一条独立使用的伪指令,而THIS出现在操作数位置,与EQU伪指令配合定义一个具有类型、段基址和偏移量三属性的表示存储器操作数的符号。属性操作符属性操作符例如:例如:FOOB EQU THIS BYTE FOOW DW 100 DUP (?) FOOB和FOOW段基址和偏移量均相同,但FOOB是字节类型的变量,访问它就是按字节访问,而访问FOOW就是按字访问。又如: F_JMP EQU THIS FARN_JMP: DEC CX 使“DEC CX”指令具有一个FAR属性的地址F_JMP,于是允许其它段的JMP指令远跳转到这里。如果没有第一条语句,则默认“D

45、EC CX”指令具有一个NEAR属性的地址。属性操作符属性操作符SHORT操作符操作符 用来确定转移地址的属性,用在JMP指令中,规定转移范围在下条指令地址的128127个字节内。 如 JMP SHORT LAB字节分离操作符字节分离操作符HIGH、LOW 它接收一个数字或地址表达式,HIGH 取其高字节,LOW 取其低字节。例如: COUNT EQU 1234H MOV AL,LOW COUNT 汇编结果为MOV AL, 34H优先级优先级运算符运算符1 1圆括号、尖括号、方括号、圆点符、圆括号、尖括号、方括号、圆点符、LENGTHLENGTH、SIZESIZE、WIDTHWIDTH和和MA

46、SKMASK2 2PTRPTR,OFFSETOFFSET,SEGSEG,TYPETYPE,THISTHIS及段修改操作符及段修改操作符3 3HIGHHIGH和和LOWLOW4 4* *,/ /,MODMOD,SHLSHL,SHRSHR5 5,6 6关系操作:关系操作:EQEQ,NENE,LTLT,LELE,GTGT,GEGE7 7逻辑:逻辑:NOTNOT8 8逻辑:逻辑:ANDAND9 9逻辑:逻辑:OROR,XORXOR1010SHORTSHORT操作操作符总结符总结汇编语言中各种运算符及其优先级别汇编语言中各种运算符及其优先级别3.4 汇编语言程序正常结束的方式汇编语言程序正常结束的方式在

47、.COM文件中和DEBUG下所写程序可用INT 20H或INT 3H终止程序。对.EXE类型的应用程序可通过用INT 21H系统功能调用来终止程序,也可用RET来终止程序,但后者必须将执行模块定义为过程。对于任一装入内存的可执行文件,DOS都将在代码段前100H字节中建立程序段前缀PSP。通过20H号中断处理程序终止程序前,代码段寄存器CS必须含有PSP的段值。由于对EXE类型的应用程序而言,其代码段与PSP不是同一个段,所以不能简单地直接利用INT 20H来终止程序。DOS在PSP的偏移0处,安排了INT 20H指令。应用程序只要设法转到PSP的偏移0处,就能实现程序的终止。 例如,用RET

48、指令终止程序如下: MAIN PROC FAR;使用过程,主程序开始PUSH DS;为程序返回DOS设置堆栈值,入栈保存原DS段址MOV AX,0;设置偏移地址为0PUSH AX;入栈保存偏移地址RET ;用过程返回DOSMAIN ENDP;主程序结束汇编语言程序正常结束的方式汇编语言程序正常结束的方式发送INT 21H中断终止程序前必须保证CS段寄存器中含有程序段前缀PSP的段地址。这个段地址传给DOS中的程序,目的是为了恢复这个程序进入时原有的结束出口、Ctrl+Break出口和标准错误出口地址。为了在程序结束时能带回一个正确和错误的编码,使用DOS功能调用4CH和31H。例如: MOV

49、AH, 4CH INT 21H这两种结束返回DOS提示符下的方法较之直接使用INT 20H更好些,而且这两个内部功能调用曾多次使用了中断20H。3.5 汇编语言运行及调试环境汇编语言运行及调试环境汇编语言源程序是一个文本文件,其默认扩展名为.asm,在将其汇编(也称为翻译)成机器语言之前,必须首先生成该文件;可以用任何文本编辑工具编辑,包括Windows下的“记事本”、“写字板”,乃至“Word”来编辑汇编语言源程序。如果使用“Word”一定要保存为无格式的纯文本文件,而不是.doc或其他文件格式。程序设计时,首先提取要处理问题的数学模型,寻找合适的算法,在已知算法的基础上遵循汇编语言规范,构

50、思程序流程,必要时画出流程图(也称作框图),最后按照流程图用汇编语句逐一实现流程图中的每一步,形成源程序。汇编语言源程序文件.asm生成后,需要经过汇编生成.obj中间文件,然后连接.obj才能够最终生成.exe可执行文件。本节介绍下列内容:本节介绍下列内容:3.5.1 DOS下下Edit的使用的使用3.5.2 Debug调试汇编程序调试汇编程序3.5.3 EMU8086的使用的使用3.5.4 用用MASM(或或ASM)运行汇编语言程序运行汇编语言程序3.5.1 DOS下下Edit的使用的使用(1)进入)进入Edit的的DOS环境窗口环境窗口Windows下,选择【开始】|【运行】命令,弹出【

51、运行】对话框,如图3-1所示,在【打开】下拉列表框中输入edit,单击【确定】按钮,进入DOS环境下的Edit窗口,如图3-2所示。图3-1 Windows运行对话框图3-2 Edit窗口DOS下下Edit的使用的使用(2)用)用Edit编辑汇编语言程序编辑汇编语言程序 Edit编辑是一个DOS环境的编辑软件,因此主要用键盘操作。Edit窗口全屏幕显示的切换方式是按Alt+Enter组合键,一旦切换到全屏幕方式,其显示如同在DOS环境下的状态,必要时可以再次按Alt+Enter组合键返回到窗口方式。图3-3 Edit窗口Edit窗口的上方是命令菜单选项:File、Edit、Search、Vie

52、w、Options和Help。通过组合键Alt+菜单项的首字母,可以打开相应的菜单选项。例如,按Alt+F组合键弹出File菜单,如图3-3所示。 3.5.2 Debug调试汇编程序调试汇编程序用用Debug运行汇编语言程序运行汇编语言程序 Debug调试程序是以DOS外部命令程序的形式提供的,它的文件名是D。在进入Debug的提示符“-”之后,用户可以通过Debug的命令输入汇编源程序,并用相应命令将其汇编成机器语言程序,然后调试并运行该程序。使用Debug运行汇编程序较之使用ASM和MASM运行有以下优点。可在最底层环境下直接运行,免去使用ASM或MASM所必须熟悉的文本编辑程序、ASM和

53、MASM汇编程序,以及LINK程序的麻烦,因而调试周期短;熟悉Debug命令的使用,可以为以后的软件开发掌握一种最容易找到的调试工具。这是因为Debug除了可运行汇编语言程序外,还可以直接用来检查和修改内存单元、装入、存储及启动可执行程序,检查及修改寄存器。也就是说Debug命令可以深入到计算机的基本级,可使用户通过这些命令了解计算机底层的工作状态。 然而在Debug下调试和运行汇编语言程序也受到了一些限制,即不宜汇编较长的程序,不便于分块程序设计,也不便于形成以DOS外部命令形式构成的EXE文件,不能使用浮动地址,也不能使用绝大多数ASM和MASM提供的伪指令。Debug调试汇编程序调试汇编

54、程序举例举例 显示内存中的内容,理解内存分段的本质含义。显示内存中的内容,理解内存分段的本质含义。(1)进入)进入Debug 在Windows下,选择【开始】|【运行】命令,弹出【运行】对话框,如图3-4所示,在【打开】下拉列表框中输入debug,单击【确定】按钮,进入DOS环境下的Debug窗口,其标志是Debug的命令提示符“-”,如图3-5所示。图3-4 运行Debug图3-5 Debug窗口Debug调试汇编程序调试汇编程序Debug的提示符是“-”,在这一提示符下输入Debug的命令,Debug将对命令解释并且执行。Debug命令的关键字是单个字母,并且不区分大小写,关键字用来指出该

55、命令做什么。依命令的不同,关键字后可以给出操作参数,操作参数指出了该命令按照何种方式去进行。关键字与参数、参数与参数之间用空格隔开,命令若结束按Enter键(回车键)。必要时按Ctrl+Break组合键可中止命令的执行,Ctrl+Num Lock组合键可暂停屏幕卷动,按任一键继续。Debug下所用数据均为十六进制数,且不必写H,如果写H会导致错误发生。 Debug调试汇编程序调试汇编程序(2)用)用Debug的的E命令修改内存单元的内容命令修改内存单元的内容 如图3-6所示,在Debug的命令提示符“-”后,输入E 1000:100 I Love Asm后并按Enter键。Debug的E命令用

56、于修改指定内存单元的内容,在后续部分会详细介绍。(3)用)用Debug的的D命令和命令和D的不同地址参数显示同样单元的内容。的不同地址参数显示同样单元的内容。 继步骤(2)操作之后,在Debug的命令提示符“-”后,输入D 1000:100 109后并按Enter键,观察屏幕右侧字符显示区域的内容,找到I Love Asm字符串,想想为什么?在新就绪的命令提示符“-”后,输入D 1010:0 9后并按Enter键,观察右侧字符显示区域的内容。在新就绪的命令提示符“-”后,再输入D 900:7100 7109后并按Enter键,观察右侧字符显示区域的内容。在新就绪的命令提示符“-”后,再输入 D

57、 11:FFF0 FFF9后并按Enter键,观察右侧字符显示区域的内容。 Debug调试汇编程序调试汇编程序图3-6 Debug结果典型典型Debug命令剖析命令剖析D (1)显示内存命令)显示内存命令D (Display )功能:功能:显示内存内容。格式:格式:D命令有以下三种格式。格式一: D格式二: D 格式三: D 说明:说明:格式一格式一 D进入Debug后,在命令提示符“-”下单独输入D命令后回车,将在屏幕上显示当前段、位移为100H起始的128个字节的内容。每行显示16个字节的内容。屏幕左侧为起始地址“段地址:位移”;中间以十六进制形式显示16个字节的内容,前8个与后8个之间用

58、短横线分隔,以便于阅读;右侧以ASCII码字符形式显示这16个单元的内容,如果该单元内容为不可显示字符,则以小数点的形式显示。格式一的D命令仅能受限制地从当前代码段位移为 100H处开始显示,或是继前一次后显示紧接着的 128 个单元内容。当需要更快捷地直接显示内存中某指定地址处开始的内容时,可以使用带地址的D命令。典型典型Debug命令剖析命令剖析D 格式二格式二 D 带地址的D命令仍然显示128个字节,但总是从一个能够被16整除的地址开始排列;这里的“地址”不但支持形如1000:82这样指定了段地址及位移的绝对地址,还可以仅仅输入D及位移,这种情况总是默认为当前段地址;任何时候输入的单字母

59、“D”命令总是接着上一次的内容继续显示。格式三格式三 D 当需要观察的内存内容限定在一个特定范围内时,用带“范围”参数的D命令会更加方便。例如,当仅仅需要显示当前段,位移从100H开始到10AH为止的内存内容时,可以通过命令“D 100 10A”得到所需要的内容还可以通过指定:“开始段基址:位移 结束位移”决定要显示的相应范围,如图2-13所示。也可以通过指定:“开始段基址:位移 L 长度”的方式决定要显示的相应范围等。 典型典型Debug命令剖析命令剖析D 典型典型Debug命令剖析命令剖析E (1)编辑修改内存命令)编辑修改内存命令E (Edit)功能:功能:编辑修改内容 。格式:格式:E

60、 说明:说明:这里 “地址”概念同前面的D命令;Debug的E命令首先以十六进制形式显示指定地址的原值并以小数点结尾,然后等待输入新值,按空格键跳到下一个要修改的字节,并继续按这种方法修改。如果等待输入新值时直接按空格,当前字节的内容将被保留并跳到下一个字节等待修改,直到按Enter键为止。例如,如图所示,在命令提示符“-”后输入E 203,并观测操作结果。典型典型Debug命令剖析命令剖析E 举例 用E命令直接输入显示单个字符的代码程序并且执行 进入Debug后,按以下过程操作并观察结果:-e200 b2 33 b4 02 cd 21 cd 20-g=2003Program terminat

温馨提示

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

评论

0/150

提交评论