汇编语言上机指导

上传人:pu****.1 文档编号:577728272 上传时间:2024-08-22 格式:PPT 页数:181 大小:1,007.51KB
返回 下载 相关 举报
汇编语言上机指导_第1页
第1页 / 共181页
汇编语言上机指导_第2页
第2页 / 共181页
汇编语言上机指导_第3页
第3页 / 共181页
汇编语言上机指导_第4页
第4页 / 共181页
汇编语言上机指导_第5页
第5页 / 共181页
点击查看更多>>
资源描述

《汇编语言上机指导》由会员分享,可在线阅读,更多相关《汇编语言上机指导(181页珍藏版)》请在金锄头文库上搜索。

1、汇编语言程序设计汇编语言程序设计主讲主讲:陶雪丽:陶雪丽E-mail:xueli_单位单位:河南师范大学计算机与信息技术:河南师范大学计算机与信息技术学院学院教学重点教学重点第第3章章学学习习了了8086硬硬指指令令,第第4章章介介绍绍MASM基基本本的的伪伪指指令令(伪伪操操作作)。第第4章章重点掌握:重点掌握:程序的格式、开发方法程序的格式、开发方法参参数数的的表表达达、变变量量的的定定义义变量和标号的属性变量和标号的属性硬指令和伪指令硬指令和伪指令硬指令硬指令硬指令硬指令使使CPU产生动作、并在程序执行时才处理的语产生动作、并在程序执行时才处理的语句,就是第句,就是第3章学习的处理器指令

2、。章学习的处理器指令。伪指令伪指令伪指令伪指令(伪操作:(伪操作:Directive)不产生不产生CPU动作、在程动作、在程序执行前由汇编程序处理的说明性语句,例如,处理器选序执行前由汇编程序处理的说明性语句,例如,处理器选择、定义程序模式、定义数据、分配存储区、指示程序结择、定义程序模式、定义数据、分配存储区、指示程序结束等等。束等等。伪指令与具体的处理器类型无关,但与汇编程序的版本有伪指令与具体的处理器类型无关,但与汇编程序的版本有关。关。第四章第四章 汇编语言程序格式汇编语言程序格式4.1汇编语言程序的开发汇编语言程序的开发4.2参数、变量、标号及相关伪操作参数、变量、标号及相关伪操作4

3、.3程序段的定义的相关伪操作程序段的定义的相关伪操作后一页后一页前一页前一页退出退出4.1 汇编语言程序的开发汇编语言程序的开发4.1.1 汇编程序功能汇编程序功能4.1.2 汇编语言程序的语句格式汇编语言程序的语句格式4.1.3 汇编语言程序的程序格式汇编语言程序的程序格式4.1.4 汇编语言程序的上机过程汇编语言程序的上机过程后一页后一页前一页前一页目目录录退出退出4.1.1 汇编程序功能汇编程序功能汇编语言程序的建立及汇编过程汇编语言程序的建立及汇编过程汇编程序的主要功能汇编程序的主要功能常用的汇编程序常用的汇编程序后一页后一页前一页前一页目目录录退出退出(1)汇编语言程序的建立及汇编过

4、)汇编语言程序的建立及汇编过程程汇编语言程序的建立及汇编过程,汇编语言程序的建立及汇编过程,如图如图4.1所示所示。在计算机上运行汇编语言程序的步骤是:在计算机上运行汇编语言程序的步骤是:用用编辑程序编辑程序建立建立ASM源文件;源文件;用用MASM程序程序把把ASM文件转换成文件转换成OBJ文件;文件;用用LINK程序程序把把OBJ文件转换成文件转换成EXE文件;文件;用用DOS命令命令直接键入文件名就可执行该程序。直接键入文件名就可执行该程序。后一页后一页前一页前一页目目录录退出退出(2)汇编程序的主要功能)汇编程序的主要功能检查源程序。检查源程序。测出源程序中的语法错误,并给出出错信息。

5、测出源程序中的语法错误,并给出出错信息。产生源程序的目标程序,并可给出列表文件(同时列出汇产生源程序的目标程序,并可给出列表文件(同时列出汇编语言和机器语言的文件,称为编语言和机器语言的文件,称为LST文件)。文件)。展开宏指令。展开宏指令。后一页后一页前一页前一页目目录录退出退出(3)常用的汇编程序)常用的汇编程序Microsoft公司推出的宏汇编程序公司推出的宏汇编程序MASM(Macro Assembler););Borland公司推出的公司推出的TASM(Turbo Assembler)。)。本课程采用本课程采用MASM6.11后一页后一页前一页前一页退出退出目目录录图图4.1 汇编语

6、言程序的建立及汇编过汇编语言程序的建立及汇编过程程编辑程序编辑程序汇编程序汇编程序连接程序连接程序MASMLINKPROGR.ASM文件文件PROGR.OBJ文件文件PROGR.EXE文件文件返回返回4.1.2 汇编语言程序的语句格式汇编语言程序的语句格式汇编语言语句格式:汇编语言语句格式:nameoperation operand ; comment执行性语句执行性语句由硬指令构成的语句,它通常对应一条机由硬指令构成的语句,它通常对应一条机器指令,出现在程序的代码段中:器指令,出现在程序的代码段中:标号标号: 硬指令助记符硬指令助记符 操作数,操作数操作数,操作数;注释;注释说明性语句说明性

7、语句由伪指令构成的语句,它通常指示汇编程由伪指令构成的语句,它通常指示汇编程序如何汇编源程序:序如何汇编源程序:名字名字 伪指令助记符伪指令助记符 参数,参数参数,参数,;注释;注释后一页后一页前一页前一页退出退出目目录录1. 名字(名字(name)项)项源程序中用下列字符来表示名字项(源程序中用下列字符来表示名字项(name):字母字母AZ数字数字09专用字符专用字符?,?, , , ,$注意:注意:名字不能以数字开头。名字不能以数字开头。名字中如果用到名字中如果用到 ,则必须是第一个字符。,则必须是第一个字符。汇编程序只识别名字的前汇编程序只识别名字的前31个字符。个字符。默认情况下,汇编

8、程序不区别标识符中的字母大小写。默认情况下,汇编程序不区别标识符中的字母大小写。后一页后一页前一页前一页退出退出目目录录标号、名字与标识符标号、名字与标识符name可以是标号或变量。它们都用来表示本语句的符号可以是标号或变量。它们都用来表示本语句的符号地址,都是可有可无的,只有当需要用到符号地址来访问地址,都是可有可无的,只有当需要用到符号地址来访问该语句时,它才需要出现。该语句时,它才需要出现。标号:标号:在代码段中定义,是反映硬指令位置(逻辑地址)的在代码段中定义,是反映硬指令位置(逻辑地址)的标识符,后跟一个冒号分隔。标识符,后跟一个冒号分隔。经常在转移指令或经常在转移指令或CALL指令

9、的操作数字段出现,用以指令的操作数字段出现,用以表示转向地址。表示转向地址。后一页后一页前一页前一页退出退出目目录录标号、名字与标识符标号、名字与标识符名字:名字:是反映伪指令位置(逻辑地址)和属性的标识符,后是反映伪指令位置(逻辑地址)和属性的标识符,后跟空格或制表符分隔,没有冒号。跟空格或制表符分隔,没有冒号。可用可用LABEL或或EQU伪操作来定义。伪操作来定义。还可以作为过程名定义(第六章中介绍)。还可以作为过程名定义(第六章中介绍)。标识符标识符(Identifier):):每个标识符的定义是唯一的,还不能是汇编语言采用每个标识符的定义是唯一的,还不能是汇编语言采用的的保留字保留字。

10、后一页后一页前一页前一页退出退出目目录录2. 保留字保留字保留字(保留字(Reserved Word)是汇编程序已经利用的标识符,)是汇编程序已经利用的标识符,主要有:主要有:硬指令助记符硬指令助记符例如:例如:MOV、ADD伪指令助记符伪指令助记符例如:例如:DB、EQU操作符操作符例如:例如:OFFSET、PTR寄存器名寄存器名例如:例如:AX、CS预定义符号预定义符号例如:例如:data后一页后一页前一页前一页退出退出目目录录3. 指令助记符指令助记符硬指令助记符硬指令助记符可以是任何一条处理器指令,也可以是一条可以是任何一条处理器指令,也可以是一条宏指令宏指令伪指令助记符伪指令助记符将

11、在本章和下章学习。将在本章和下章学习。前一章引入的定义字节数据和字符串的前一章引入的定义字节数据和字符串的DB就是伪指令。就是伪指令。后一页后一页前一页前一页退出退出目目录录4. 操作数与参数操作数与参数处理器指令的处理器指令的操作数操作数可以是立即数、寄存器和存储单元。可以是立即数、寄存器和存储单元。伪指令的伪指令的参数参数可以是常数、变量名、表达式等,可以有多可以是常数、变量名、表达式等,可以有多个,参数之间用逗号分隔。个,参数之间用逗号分隔。后一页后一页前一页前一页退出退出目目录录5. 注释(注释(comment)项)项注释(注释(comment)项:项:用来说明程序或语句的功能。用来说

12、明程序或语句的功能。;为注释的开始。;为注释的开始。;可以从一行的第一个字符开始,此时整行都是注释,;可以从一行的第一个字符开始,此时整行都是注释,常用来说明下面一段程序的功能。常用来说明下面一段程序的功能。汇编程序在翻译源程序时将跳过该部分,不对它们做任何汇编程序在翻译源程序时将跳过该部分,不对它们做任何处理。处理。后一页后一页前一页前一页退出退出目目录录6. 分隔符分隔符语句的语句的4个组成部分要用分隔符分开。个组成部分要用分隔符分开。标号后用冒号,注释前用分号。标号后用冒号,注释前用分号。操作数之间和参数之间使用逗号分隔。操作数之间和参数之间使用逗号分隔。其他部分通常采用空格或制表符。其

13、他部分通常采用空格或制表符。多个空格和与一个制表符的作用相同。多个空格和与一个制表符的作用相同。MASM支持续行符支持续行符 “”。后一页后一页前一页前一页退出退出目目录录4.1.3 汇编语言程序的程序格式汇编语言程序的程序格式完整的汇编语言源程序由完整的汇编语言源程序由段段组成。组成。一个汇编语言源程序可以包含若干个代码段、数据段、附一个汇编语言源程序可以包含若干个代码段、数据段、附加段或堆栈段,段与段之间的顺序可随意排列。加段或堆栈段,段与段之间的顺序可随意排列。需独立运行的程序必须包含一个代码段,并指示程序执行需独立运行的程序必须包含一个代码段,并指示程序执行的起始点,一个程序只有一个起

14、始点。的起始点,一个程序只有一个起始点。所有的可执行性语句必须位于某一个代码段内,说明性语所有的可执行性语句必须位于某一个代码段内,说明性语句可根据需要位于任一段内。句可根据需要位于任一段内。通常,程序还需要一个堆栈段。通常,程序还需要一个堆栈段。汇编语言源程序段定义格式有两种:汇编语言源程序段定义格式有两种:简化段定义格式简化段定义格式从从MASM 5.0开始支持开始支持完整段定义格式完整段定义格式MASM 5.0以前就具有以前就具有后一页后一页前一页前一页退出退出目目录录;PROGRAM TITLE GOES HERE-;Followed by descriptive phrases;EQ

15、U STATEMENTS GO HERE;*Datarea segment;define data segment;DATA GOES HEREDatarea ends;*Prognam segment;define code segment;-汇编语言源程序举例汇编语言源程序举例1后一页后一页前一页前一页退出退出目目录录Main procfar;main part of programassumecs: program , ds: datareaStart:;starting execution address;set up stack for returnpush ds;save old

16、data segmentsub ax , ax;put zero in axpush ax;save it on stack;set DS register to current data segmentmov ax , datarea;datarea segment addrmov ds , ax;into DS register;MAIN PART OF PROGRAM GOES HERE汇编语言源程序举例汇编语言源程序举例1首先把首先把DS的内容和的内容和0作为段地址和偏移地址作为段地址和偏移地址入栈,以便在程序结束时用入栈,以便在程序结束时用RET指令返回指令返回DOS,这是一种工作方

17、式。如果在主程序,这是一种工作方式。如果在主程序开始时没有这三条指令在堆栈段建立返回开始时没有这三条指令在堆栈段建立返回信息,则在程序结束时就不能直接用信息,则在程序结束时就不能直接用RET返回指令,而应该用返回指令,而应该用DOS功能调用功能调用4CH:MOV AX , 4C00HINT 21H这种方式更加普遍。这种方式更加普遍。后一页后一页前一页前一页退出退出目目录录ret;return to DOSMain endp;end of main part of program;-Sub1procnear;define subprocedure;SUBROUTINE GOES HERESub1

18、endp;end of subprocedure;-Prognam end;end of code segment;*end start;end of assembly汇编语言源程序举例汇编语言源程序举例1后一页后一页前一页前一页退出退出目目录录.model small;define memory model.stack 100h;define stack segment.data;define data segment;DATA GOES HERE.code;define code segmentMain procfarStart:mov ax , data;data segment add

19、rmov ds , ax;into DS register汇编语言源程序举例汇编语言源程序举例2后一页后一页前一页前一页退出退出目目录录;MAIN PART OF PROGRAM GOES HEREmov ax , 4c00hint 21h;return to DOSMain endp;end of main programend start;end of assembly汇编语言源程序举例汇编语言源程序举例2后一页后一页前一页前一页退出退出目目录录4.1.4 汇编语言程序的上机过程汇编语言程序的上机过程建立汇编语言的工作环境建立汇编语言的工作环境建立建立ASM文件;文件;用用MASM程序程序

20、产生产生OBJ文件;文件;用用LINK程序程序产生产生EXE文件;文件;程序的执行。程序的执行。后一页后一页前一页前一页退出退出目目录录1. 建立汇编语言的工作环境建立汇编语言的工作环境为运行汇编语言程序至少要在磁盘上建立以下文件:为运行汇编语言程序至少要在磁盘上建立以下文件:编辑程序,如编辑程序,如EDIT.EXE汇编程序,如汇编程序,如MASM.EXE连接程序,如连接程序,如LINK.EXE调试程序,如调试程序,如DEBUG.COM必要时,还可建立如必要时,还可建立如CREF.EXE,EXE2BIN.EXE等文件。等文件。后一页后一页前一页前一页退出退出目目录录2. 建立建立ASM文件文件

21、用编辑程序用编辑程序EDIT在磁盘上建立如下的源程序在磁盘上建立如下的源程序EX_MOVS.ASM。例例4.30 把把40个字母个字母a的字符串从源缓冲区传送到目的缓冲的字符串从源缓冲区传送到目的缓冲区。区。后一页后一页前一页前一页退出退出目目录录;PROGRAM TITLES GOES HERE-ex_movs;*Datasegment;define data segmentsource_bufferdb40 dup(a)Dataends;*Extra segment;define extra segmentdest_bufferdb40 dup(?)Extra ends;*Code seg

22、ment;define code segment;-汇编语言源程序汇编语言源程序.ASM后一页后一页前一页前一页退出退出目目录录Main procfar;main part of programassume cs: code , ds: data , es: extraStart:;starting execution address;set up stack for returnpush ds;save old data segmentsub ax , ax;put zero in axpush ax;save it on stack汇编语言源汇编语言源程序程序.ASM后一页后一页前一页前一

23、页退出退出目目录录;set DS register to current data segmentmov ax , datarea;datarea segment addrmov ds , ax;into DS register;set ES register to current extra segmentmov ax , extra;extra segment addrmov es , ax;into ES register;MAIN PART OF PROGRAM GOES HERE汇编语言源汇编语言源程序程序.ASM后一页后一页前一页前一页退出退出目目录录lea si , source

24、_buffer;put offset addr of source;buffer in SIlea di , dest_buffer;put offset addr of dest;buffer in DIcld;set DF flag to forwardmov cx , 40;put count in CXrep movsb;move entire stringret;return to DOSMain endp;end of code segment;-Code ends;end of code segment;*end start;end of assembly后一页后一页前一页前一页

25、退出退出目目录录3. 用用MASM程序产生程序产生OBJ文件文件用汇编程序对源程序文件汇编,产生二进制的目标文件(用汇编程序对源程序文件汇编,产生二进制的目标文件(.OBJ文文件),其操作与汇编程序回答如下:件),其操作与汇编程序回答如下:Cmasm ex_movsMicrosoft ( R ) Macro Assembler Version 5.00Copyritht ( C ) Microsoft Corp 1981-1985, 1987 , All rights reserved.Object filename ex_movs , obj :Source listing NUL. LST

26、 :ex_movsCross-reference NUL . CRF :ex_movs51646+447778 Bytes symbol space free0 Warning Errors0 Severe ErrorsOBJ文件文件列表文件列表文件(.LST)段名表和符号表文段名表和符号表文件(件(.CRF文件)文件)后一页后一页前一页前一页退出退出目目录录例例4.30的列表文件的列表文件EX_MOVS.LST。这个文件同时列出了源程序和机器语言程序清单,并给这个文件同时列出了源程序和机器语言程序清单,并给出符号表,方便程序调试。出符号表,方便程序调试。这个文件可有可无,如果不需要,则直接在

27、这个文件可有可无,如果不需要,则直接在 NUL . LST :后敲回车;否则,可回答文件名,这里是后敲回车;否则,可回答文件名,这里是ex_movs。程序请看教材程序请看教材P148-151。后一页后一页前一页前一页退出退出目目录录例例4.30 的交叉引用表的交叉引用表EX_MOVS.REF文件。文件。汇编程序提供的第三个文件是汇编程序提供的第三个文件是CRF文件,用来产生交叉引文件,用来产生交叉引用表用表REF。交叉引用表给出了用户定义的所有符号,对于每个符号列交叉引用表给出了用户定义的所有符号,对于每个符号列出了其定义所在行号(加上出了其定义所在行号(加上#)及引用的行号。)及引用的行号。

28、CRF文件,为大程序的修改提供方便,而一般较小的程序文件,为大程序的修改提供方便,而一般较小的程序则可不使用,所以可直接在则可不使用,所以可直接在 NUL.REF:后直接敲回车;后直接敲回车;如果希望建立交叉引用表,则应用文件名来回答,这里是如果希望建立交叉引用表,则应用文件名来回答,这里是ex_movs,这样就产生了,这样就产生了EX_MOVS.CRF文件。文件。为了建立交叉引用表,必须调用为了建立交叉引用表,必须调用CREF程序,所以如果需程序,所以如果需要就应该从系统中把要就应该从系统中把CREF.EXE文件文件COPY到你的磁盘上。到你的磁盘上。具体做法和程序,请看教材具体做法和程序,

29、请看教材P151-152。后一页后一页前一页前一页退出退出目目录录4. 用用LINK程序产生程序产生EXE文件文件OBJ文件不是可执行文件,还需要用连接程序文件不是可执行文件,还需要用连接程序LINK把把OBJ文件文件转换为可执行的转换为可执行的EXE文件。文件。如果一个程序是由多个模块组成时,也要通过连接程序如果一个程序是由多个模块组成时,也要通过连接程序LINK把把它们连接在一起,操作方法及机器回答如下:它们连接在一起,操作方法及机器回答如下:Clink ex_movsMicrosoft ( R ) Macro Assembler Version 5.00Copyritht ( C ) M

30、icrosoft Corp 1981-1985, 1987 , All rights reserved.Run File EX_MOVS.EXE :List File NUL. MAP :ex_movsLibraries. LIB:LINK:Warning L4021:no stack segmentEXE文件文件列表文件(列表文件(.MAP)库文件库文件LIB后一页后一页前一页前一页退出退出目目录录LINK程序的文件程序的文件LINK程序有两个输入文件程序有两个输入文件OBJ和和LIB。OBJ是需要连接的目标文件;是需要连接的目标文件;LIB是程序中要用到的库文件,如无需要,则直接敲回是程序

31、中要用到的库文件,如无需要,则直接敲回车。车。LINK程序有两个输出文件程序有两个输出文件EXE和和MAP。EXE是最后得到的可执行文件;直接敲回车。是最后得到的可执行文件;直接敲回车。MAP是连接程序的列表文件,又称为连接映像(是连接程序的列表文件,又称为连接映像(link map),它给处每个段在存储器中的分配情况。),它给处每个段在存储器中的分配情况。后一页后一页前一页前一页退出退出目目录录例例4.30的连接映像的连接映像EX_MOVS.MAP文件文件LINK: warning L4021:no stack segmentStartStopLength Nameclass00000H00

32、027H00028HDATA00030H00057H00028HEXTRA00060H0007CH0001DHCODEProgram entry point at 0006:0000连接程序在给出的无堆栈段的警告性错误并不映像程序的运连接程序在给出的无堆栈段的警告性错误并不映像程序的运行。行。到此,连接过程已结束,可以执行到此,连接过程已结束,可以执行EX_MOVS程序了。程序了。后一页后一页前一页前一页退出退出目目录录5. 程序的执行程序的执行在建立了在建立了EXE文件后,就可以直接从文件后,就可以直接从DOS执行程序,如下执行程序,如下所示:所示:Cex_movsC程序运行结束并返回程序运

33、行结束并返回DOS。如果用户程序中,有在终端显示结果的语句,则程序运行如果用户程序中,有在终端显示结果的语句,则程序运行结束,可在终端看到运行结果。结束,可在终端看到运行结果。EX_MOVS程序没有显示结果的语句,则可通过调试程序程序没有显示结果的语句,则可通过调试程序DEBUG的的D命令来检查附加段是否已得到了从源缓冲区传命令来检查附加段是否已得到了从源缓冲区传来的来的40个字母个字母a。后一页后一页前一页前一页退出退出目目录录4.2 参数、变量、标号及相关伪操作参数、变量、标号及相关伪操作4.2.1 数值型参数数值型参数4.2.2 数据定义及存储器分配伪操作数据定义及存储器分配伪操作4.2

34、.3 地址计数器与对准伪操作地址计数器与对准伪操作4.2.4 变量和标号的属性变量和标号的属性后一页后一页前一页前一页退出退出目目录录本节重点本节重点本节详细讨论汇编语言程序语句的主要部分:本节详细讨论汇编语言程序语句的主要部分:参数参数 变量名变量名 标号标号并引出相关的伪指令和操作符。并引出相关的伪指令和操作符。本节重点掌握:本节重点掌握:常数的表达常数的表达变量定义伪指令变量定义伪指令DB/DW/DD地址操作符和类型操作符地址操作符和类型操作符后一页后一页前一页前一页退出退出目目录录4.2.1 数值型参数数值型参数在源程序语句格式的在源程序语句格式的4个组成部分中,参数是指令的操作个组成

35、部分中,参数是指令的操作对象(在学习硬指令时被称为操作数),由一个或多个表对象(在学习硬指令时被称为操作数),由一个或多个表达式组成,参数之间用逗号分隔。达式组成,参数之间用逗号分隔。参数根据指令不同可以没有,可以有参数根据指令不同可以没有,可以有1个、个、2个或多个。个或多个。汇编语言程序中,参数可以是常数、寄存器、标号、变量汇编语言程序中,参数可以是常数、寄存器、标号、变量或由表达式组成。指令参数有数值型,它的主要形式是或由表达式组成。指令参数有数值型,它的主要形式是常常数数和和数值表达式数值表达式。硬指令的操作数有立即数;立即数就要用数值型参数表达。硬指令的操作数有立即数;立即数就要用数

36、值型参数表达。后一页后一页前一页前一页退出退出目目录录1. 常数常数常数(常量)常数(常量)表示一个固定的数值。表示一个固定的数值。它又分成多种形式:它又分成多种形式:十进制常数十进制常数十六进制常数十六进制常数二进制常数二进制常数八进制常数八进制常数字符串常数字符串常数符号常数符号常数表达式赋值伪操作表达式赋值伪操作EQU基数控制伪操作基数控制伪操作后一页后一页前一页前一页退出退出目目录录十进制常数十进制常数由由0 9数字组成,以字母数字组成,以字母D或或d结尾。结尾。缺省情况下,后缀缺省情况下,后缀D或或d可以省略。可以省略。汇编语言大小写不敏感,汇编语言大小写不敏感,D和和d通用。通用。

37、例如:例如:100、255D后一页后一页前一页前一页退出退出目目录录十六进制常数十六进制常数由由09、AF组成,以字母组成,以字母H或或h结尾。结尾。以字母以字母AF开头的十六进制数,前面要用开头的十六进制数,前面要用0表达,以避免表达,以避免与其他符号混淆。与其他符号混淆。汇编语言大小写不敏感,汇编语言大小写不敏感, H和和h 通用通用例如:例如:64H、0FFh、0B800H后一页后一页前一页前一页退出退出目目录录二进制常数二进制常数由由0或或1两个数字组成,以字母两个数字组成,以字母B或或b结尾。结尾。汇编语言大小写不敏感,汇编语言大小写不敏感,B和和b通用。通用。例如:例如:01101

38、100B后一页后一页前一页前一页退出退出目目录录八进制常数八进制常数由由0 7数字组成,以字母数字组成,以字母Q或或q结尾。结尾。汇编语言大小写不敏感,汇编语言大小写不敏感,Q和和 q 通用。通用。例如:例如:144Q各种进制的数据以后缀字母区分,默认不加后缀字母的是各种进制的数据以后缀字母区分,默认不加后缀字母的是十进制数。十进制数。后一页后一页前一页前一页退出退出目目录录 基数控制伪操作基数控制伪操作MASM提供基数控制提供基数控制.RADIX伪指令可以改变默认进制,其伪指令可以改变默认进制,其格式是:格式是:.RADIX n 其中,其中,n用来表示基数值(用十进制数表示)。用来表示基数值

39、(用十进制数表示)。例如:例如:MOV BX , 0FFH.RADIX16与与MOV BX , 178MOV BX , 0FFHMOV BX , 178D是等价的。是等价的。.RADIX 16把基数定位十六进制把基数定位十六进制后,十进制数后面都应跟字母后,十进制数后面都应跟字母D。如果某个十六进制数的末字符如果某个十六进制数的末字符为为D,则应在其后跟字母,则应在其后跟字母H,以,以免与十进制数发生混淆。免与十进制数发生混淆。后一页后一页前一页前一页退出退出目目录录字符串常数字符串常数用单引号或双引号括起来的单个字符或多个字符,其数值用单引号或双引号括起来的单个字符或多个字符,其数值是每个字

40、符对应的是每个字符对应的ASCII码的值。码的值。例如:例如:d = 64HAB= 4142HHello, Everybody !后一页后一页前一页前一页退出退出目目录录符号常数符号常数利用一个标识符表达的一个数值。利用一个标识符表达的一个数值。MASM提供等价机制,用于常量定义。提供等价机制,用于常量定义。符号定义伪指令:符号定义伪指令:等价等价EQU伪指令伪指令等号等号=伪指令伪指令常数若使用有意义的符号名来表示,可以提高程序的可读常数若使用有意义的符号名来表示,可以提高程序的可读性,同时更具有通用性。性,同时更具有通用性。后一页后一页前一页前一页退出退出目目录录表达式赋值伪操作表达式赋值

41、伪操作EQU符号定义伪指令:用于常量定义,利用一个标识符表达的符号定义伪指令:用于常量定义,利用一个标识符表达的一个数值。一个数值。等价等价EQU伪指令:伪指令:Expression_name EQU Expression符号名符号名 EQU 数值表达式数值表达式符号名符号名 EQU 其中符号名不允许重复定义。其中符号名不允许重复定义。等号等号=伪指令伪指令符号名符号名 = 数值表达式数值表达式符号名允许重复定义。符号名允许重复定义。常数若使用有意义的符号名来表示,可以提高程序的可读常数若使用有意义的符号名来表示,可以提高程序的可读性,同时更具有通用性。性,同时更具有通用性。二者区别二者区别后

42、一页后一页前一页前一页退出退出目目录录例:例:CONSTANT EQU256;数赋以符号名;数赋以符号名DATAEQUHEIGHT+12 ;地址表达式赋以符号名;地址表达式赋以符号名ALPHAEQU7 BETAEQUALPHA2ADDREQUVAR+BETA BEQUBETA;变址引用赋以符号名;变址引用赋以符号名BP8EQUDS:BP+8;加段前缀的变址引用赋以;加段前缀的变址引用赋以 符号名符号名P8这是一组赋值伪操作,这是一组赋值伪操作,把把725赋以符号名赋以符号名BETA,VAR+5赋以符赋以符号名号名ADDR。必须注意:在必须注意:在EQU语句的表达式中,如果有语句的表达式中,如果

43、有变量或标号的表达式,则在该语句前应该先变量或标号的表达式,则在该语句前应该先给出它们的定义。给出它们的定义。例如:例如:AB EQU DATA_ONE+2则必须放在则必须放在DATA_ONE的定义之后才行,否的定义之后才行,否则汇编程序将出错。则汇编程序将出错。EQU伪指令伪指令后一页后一页前一页前一页退出退出目目录录例:例:;*EMP EQU 7;EMP的值为的值为7EMP EQU EMP+1;错误;错误;这种情况不允许;这种情况不允许;*EMP=7;EMP的值为的值为7EMP=EMP+1;EMP的值为的值为8;这种情况是允许的;这种情况是允许的EQU与伪指令与伪指令后一页后一页前一页前一

44、页退出退出目目录录2. 数值型表达式数值型表达式数值表达式一般是指由运算符连接的各种常数所构成的表数值表达式一般是指由运算符连接的各种常数所构成的表达式。达式。汇编程序在汇编过程中计算表达式,最终得到一个数值。汇编程序在汇编过程中计算表达式,最终得到一个数值。程序运行之前,就已经计算出了表达式;所以,程序运行程序运行之前,就已经计算出了表达式;所以,程序运行速度没有变慢,但增强程序的可读性。速度没有变慢,但增强程序的可读性。MASM对除伪指令外各种汇编时处理的指令统称为操作符对除伪指令外各种汇编时处理的指令统称为操作符(Operator)。)。后一页后一页前一页前一页退出退出目目录录运算符运算

45、符算术运算符算术运算符+ - * / MOD逻辑运算符逻辑运算符AND OR XOR NOT移位运算符移位运算符SHL SHR关系运算符关系运算符EQ NE GT LT GE LE高低分离符高低分离符HIGH LOW HIGHWORD LOWWORD后一页后一页前一页前一页退出退出目目录录算术运算符算术运算符实现加、减、乘、除、取余的算术运算实现加、减、乘、除、取余的算术运算mov ax , 3 * 4 + 5;等价于等价于 mov ax,17其中其中MOD也称为取模,它产生除法之后的余数,如也称为取模,它产生除法之后的余数,如19 mod 7 = 5加加+和和减减-运算符还运算符还可以用于地

46、址表达式可以用于地址表达式。两个地址相乘、相除是无意义的;两个地址相乘、相除是无意义的;两个不同段的地址相加也是无意义的。两个不同段的地址相加也是无意义的。经常使用的是地址经常使用的是地址数字量,它是有意义的。数字量,它是有意义的。除加、减外,其他运算符的参数必须是整数。除加、减外,其他运算符的参数必须是整数。例例4.18例例4.19后一页后一页前一页前一页退出退出目目录录例例4.18MOVDX , BLOCK + (61)*2该指令实现:把首地址为该指令实现:把首地址为BLOCK的字数组的第的字数组的第6个字传送到个字传送到DX寄存器。寄存器。算术运算符举例算术运算符举例后一页后一页前一页前

47、一页退出退出目目录录例例4.19ARRARYDW1 , 2 , 3 , 4 , 5 , 6 , 7ARYENDDW?MOV CX , (ARYENDARRAY)/2;相当于;相当于MOV CX , 7以上指令实现:将以上指令实现:将ARRAY数组长度存入数组长度存入CX寄存器。寄存器。其中,其中,ARYEND是为计算数组长度而建立的符号地址。是为计算数组长度而建立的符号地址。算术运算符举例算术运算符举例后一页后一页前一页前一页退出退出目目录录逻辑运算符逻辑运算符实现实现按位按位相与、相或、异或、求反的逻辑运算。相与、相或、异或、求反的逻辑运算。or al , 03h AND 45h; 等价于等

48、价于 or al , 01h例例4.20、4.21后一页后一页前一页前一页退出退出目目录录例例4.20INAL , PORT_VALOUTPORT_VAL AND 0FEH , AL当当PORT_VAL为偶数时,输出端口号与输入端口号相同;当为偶数时,输出端口号与输入端口号相同;当PORT_VAL为奇数时,输出端口号比输入端口号小为奇数时,输出端口号比输入端口号小1。例例4.21ANDDX , PORT_VAL AND 0FEH汇编时对表达式进行计算得到一个端口号;汇编时对表达式进行计算得到一个端口号;程序运行时,将程序运行时,将DX的内容与端口号相的内容与端口号相“与与”,结果保存,结果保存

49、到到DX中。中。逻辑运算符举例逻辑运算符举例后一页后一页前一页前一页退出退出目目录录移位运算符移位运算符实现对数值的左移、右移的逻辑操作;移入低位或高位的实现对数值的左移、右移的逻辑操作;移入低位或高位的是是0。格式为:格式为:数值表达式数值表达式 SHL/SHR 移位次数移位次数若移位次数大于若移位次数大于15,则结果为,则结果为0。例如:例如:mov al , 0101b SHL (2*2);等价于等价于 mov al,01010000b后一页后一页前一页前一页退出退出目目录录关系运算符关系运算符用于比较和测试符号数值。用于比较和测试符号数值。关系运算符的两个操作数必须是数字,或是同一段内

50、的两关系运算符的两个操作数必须是数字,或是同一段内的两个存储器地址。个存储器地址。MASM用用0FFFFH(补码(补码 -1)表示条件为真。)表示条件为真。MASM用用0000H表示条件为假。表示条件为假。例例4.22:mov bx , (PORT LT 5)AND 20) OR (PORT GE 5)AND 30);当当PORT5时,汇编结果为时,汇编结果为mov bx,20;否则,汇编结果为否则,汇编结果为mov bx,30后一页后一页前一页前一页退出退出目目录录高低分离符高低分离符取数值的高半部分或低半部分。取数值的高半部分或低半部分。HIGH、LOW字节分离符:从一个字数值或符号常量中

51、得字节分离符:从一个字数值或符号常量中得到高、低字节。到高、低字节。HIGHWORD、LOWWORD字分离符:从字分离符:从MASM 6.0引入引入的,取一个符号常量(不能是其他常数)的高字或低字部的,取一个符号常量(不能是其他常数)的高字或低字部分。分。后一页后一页前一页前一页退出退出目目录录例:例:mov ah , HIGH 8765h;等价于等价于mov ah,87hCONST EQU 0ABCDH;定义一个符号常量;定义一个符号常量MOV AH , HIGH CONST;等价与;等价与MOV AH , 0ABHdd_value equ 0ffff1234h;定义一个符号常量定义一个符号

52、常量mov ax,LOWWORD dd_value;等价于等价于mov ax,1234h高低分离符举例高低分离符举例后一页后一页前一页前一页退出退出目目录录3. 运算符的优先级运算符的优先级1() LENGTH SIZE WIDTH MASK2PTR OFFSET SEG TPYE THIS :3HIGE LOW4* / MOD SHL SHR5+ -6EQ NE GT LT GE LE7NOT8AND9OR XOR10SHORT建议采用圆括号建议采用圆括号“()()”显式表达,它可以极大显式表达,它可以极大地提高程序的可阅读性。地提高程序的可阅读性。后一页后一页前一页前一页退出退出目目录录4

53、. 地址型参数地址型参数汇编语言程序中,指令参数还有地址型,它的主要形式是汇编语言程序中,指令参数还有地址型,它的主要形式是标号和名字(变量名、段名、过程名等)。标号和名字(变量名、段名、过程名等)。硬指令的操作数有存储单元;存储单元就应该用地址型参硬指令的操作数有存储单元;存储单元就应该用地址型参数(存储器操作数)表达。数(存储器操作数)表达。后一页后一页前一页前一页退出退出目目录录4.2.2 数据定义及存储器分配伪操作数据定义及存储器分配伪操作该类伪操作又称变量定义伪指令。该类伪操作又称变量定义伪指令。变量定义(变量定义(Define)伪指令为变量申请固定长度的存储空)伪指令为变量申请固定

54、长度的存储空间,并可同时将相应的存储单元初始化。间,并可同时将相应的存储单元初始化。变量名变量名 伪指令助记符伪指令助记符 初值表初值表格式:格式:Variable Mnemonic Operand , , Operand ;Commnet后一页后一页前一页前一页退出退出目目录录变量名(变量名(variable)变量名为用户自定义标识符,变量名为用户自定义标识符,表示初值表首元素的逻辑地表示初值表首元素的逻辑地址址;用这个符号表示地址,常称为符号地址。;用这个符号表示地址,常称为符号地址。变量名可以没有。这种情况,汇编程序将直接为初值表分变量名可以没有。这种情况,汇编程序将直接为初值表分配空间

55、,无符号地址。配空间,无符号地址。设置变量名是为了方便存取它指示的存储单元。设置变量名是为了方便存取它指示的存储单元。后一页后一页前一页前一页退出退出目目录录初值表初值表初值表是用逗号分隔的参数。初值表是用逗号分隔的参数。主要由数值常数、表达式或?、主要由数值常数、表达式或?、DUP组成组成?表示初值不确定,即未赋初值;表示初值不确定,即未赋初值;DUP表示重复初值。表示重复初值。DUP的格式为:的格式为:重复次数重复次数 DUP(重复参数重复参数)Repeat_count DUP (operand , , opreand)其中其中repeat_count可以是一个表达式,它的值应该是一个正可

56、以是一个表达式,它的值应该是一个正整数,用来指定括号中的操作数的重复次数。整数,用来指定括号中的操作数的重复次数。后一页后一页前一页前一页退出退出目目录录变量定义伪指令助记符变量定义伪指令助记符(Mnemonic)变量定义伪指令根据申请的主存空间单位分类,说明所定变量定义伪指令根据申请的主存空间单位分类,说明所定义的数据类型。义的数据类型。DB定义字节伪指令定义字节伪指令DW定义字伪指令定义字伪指令DD定义双字伪指令定义双字伪指令DF定义定义3字伪指令字伪指令DQ定义定义4字伪指令字伪指令DT定义定义10字节伪指令字节伪指令这些伪操作可以把其后跟着的数据存入指定的存储单元,这些伪操作可以把其后

57、跟着的数据存入指定的存储单元,形成初始化数据;或者只分配存储空间而并不存入确定的形成初始化数据;或者只分配存储空间而并不存入确定的数值,形成未初始化数据。数值,形成未初始化数据。可存储由可存储由16位段地址及位段地址及32位位偏移地址组成的远地址指针。偏移地址组成的远地址指针。可存储地址可存储地址形成压缩形成压缩BCD码码后一页后一页前一页前一页退出退出目目录录1. 定义字节单元伪指令定义字节单元伪指令DBDB伪指令用于分配一个或多个字节单元,并可以将它们伪指令用于分配一个或多个字节单元,并可以将它们初始化为指定值。初始化为指定值。初值表中每个数据一定是字节量(初值表中每个数据一定是字节量(B

58、yte),存放一个),存放一个8位位数据:数据: 可以是可以是0255的无符号数的无符号数 或是或是128127带符号数带符号数 也可以是字符串常数也可以是字符串常数后一页后一页前一页前一页退出退出目目录录2. 定义字单元伪指令定义字单元伪指令DWDW伪指令用于分配一个或多个字单元,并可以将它们初伪指令用于分配一个或多个字单元,并可以将它们初始化为指定值。始化为指定值。初值表中每个数据一定是字量(初值表中每个数据一定是字量(Word),一个字单元可),一个字单元可用于存放任何用于存放任何16位数据:位数据: 一个段地址一个段地址一个偏移地址一个偏移地址 两个字符两个字符 065535之间的无符

59、号数之间的无符号数 3276832767之间的带符号数之间的带符号数后一页后一页前一页前一页退出退出目目录录3. 定义双字单元伪指令定义双字单元伪指令DDDD伪指令用于分配一个或多个双字单元,并可以将它们伪指令用于分配一个或多个双字单元,并可以将它们初始化为指定值。初始化为指定值。初值表中每个数据是一个初值表中每个数据是一个32位的双字量(位的双字量(Double Word):): 可以是有符号或无符号的可以是有符号或无符号的32位整数位整数 也可以用来表达也可以用来表达16位段地址(高位字)和位段地址(高位字)和16位的偏移位的偏移地址(低位字)的远指针地址(低位字)的远指针varddDD

60、0,?,12345678hfarpointDD 00400078h后一页后一页前一页前一页退出退出目目录录4. 其他数据单元定义伪指令其他数据单元定义伪指令定义定义3字伪指令字伪指令DF用于为一个或多个用于为一个或多个6字节变量分配字节变量分配空间及初始化。空间及初始化。6字节常用在字节常用在32位位CPU中表示一个中表示一个48位远指针(位远指针(16位段位段选择器选择器:32位偏移地址)位偏移地址)定义定义4字伪指令字伪指令DQ用于为一个或多个用于为一个或多个8字节变量分配字节变量分配空间及初始化。空间及初始化。8字节变量可以表达一个字节变量可以表达一个64位整数位整数定义定义10字节伪指

61、令字节伪指令DT用于为一个或多个用于为一个或多个10字节变量字节变量分配空间及初始化。分配空间及初始化。10字节变量可以表达扩展精度浮点数字节变量可以表达扩展精度浮点数后一页后一页前一页前一页退出退出目目录录例例4.7 DATA_BYTE DB 10 , 4, 10HDATA_WORD DW 100 , 100H , -5DATA_DW DD 3*20 , 0FFFDH汇编程序可以在汇编期间在存储器汇编程序可以在汇编期间在存储器中存入数据,如图中存入数据,如图4.2所示。所示。操作数是常数、操作数是常数、表达式表达式后一页后一页前一页前一页退出退出目目录录例例4.8MESSAGE DB HEL

62、LODB ABDW AB则存储器存储情况如图则存储器存储情况如图4.5所示。所示。操作数是字符串操作数是字符串后一页后一页前一页前一页退出退出目目录录例例4.9 操作数?可以保留存储空间,但操作数?可以保留存储空间,但不存入数据。如:不存入数据。如:ABC DB 0 , ? , ? , ? , 0DEF DW ? , 52 , ?经汇编后的存储情况如图经汇编后的存储情况如图4.4所示。所示。操作数是?操作数是?后一页后一页前一页前一页退出退出目目录录例例4.10ARRAY1 DB 2 DUP(0 , 1 , 2 , ?)ARRAY2DB 100 DUP(?)汇编后的存储情况如图汇编后的存储情况

63、如图4.5所示。所示。重复定义重复定义DUP后一页后一页前一页前一页退出退出目目录录例例4.11 DUP操作可以嵌套,例如:操作可以嵌套,例如:ARRAY3 db 100 dup(0 , 2 dup(1 , 2) ,0 , 3)则汇编后的结果如图则汇编后的结果如图4.6所示。所示。DUP嵌套嵌套后一页后一页前一页前一页退出退出目目录录例例4.12PARAMETER_TABLE DW PAR1DWPAR2DWPAR3INTERSEG_DATADDDATA1DD DATA2则汇编程序的存储情况则汇编程序的存储情况如图如图4.7所示。所示。表达式为符号地址表达式为符号地址386及其后继机型具有及其后

64、继机型具有16位位段地址及段地址及32位偏移地址组位偏移地址组成的成的48位远地址,可用位远地址,可用DF伪指令来定义。伪指令来定义。后一页后一页前一页前一页退出退出目目录录例例4.13.386Dataseg segment para use32 dataParse_table db 2048 dup(0)Tblptr df Parse_tableDataseg ends汇编后的存储情况如图汇编后的存储情况如图4.8所示。所示。DF伪指令伪指令后一页后一页前一页前一页退出退出目目录录5. 变量定义伪指令使用说明变量定义伪指令使用说明操作数中的变量或标号可以是表达式,汇编后,存储器中操作数中的变

65、量或标号可以是表达式,汇编后,存储器中应该存入表达式的值。应该存入表达式的值。DB、DW、DD、DF、DQ、DT等伪操作在等伪操作在MASM6中可中可用用BYTE、WORD、DWORD、FWORD、QWORD、TBYTE来取代,其含义是等同的。来取代,其含义是等同的。后一页后一页前一页前一页退出退出目目录录4.2.3 地址计数器与对准伪操作地址计数器与对准伪操作地址计数器地址计数器$ORG伪操作伪操作EVEN伪操作伪操作ALIGN伪操作伪操作后一页后一页前一页前一页退出退出目目录录1. 地址计数器地址计数器$地址计数器(地址计数器(location counter)用来保存当前正在汇编的)用来

66、保存当前正在汇编的指令的偏移地址。指令的偏移地址。当开始汇编或在每一段开始时,把地址计数器初始化为零。当开始汇编或在每一段开始时,把地址计数器初始化为零。汇编过程中,每处理一条指令,地址计数器就增加一个值,汇编过程中,每处理一条指令,地址计数器就增加一个值,此值为该指令所需要的字节数。此值为该指令所需要的字节数。地址计数器的值可用符号地址计数器的值可用符号“$”表示。表示。汇编语言允许用户直接用汇编语言允许用户直接用$来引用地址计数器的值。来引用地址计数器的值。后一页后一页前一页前一页退出退出目目录录例如:例如:指令指令JNS $+6的转向地址为的转向地址为JNS指令的首地址加上指令的首地址加

67、上6。当当$用在指令中时,它表示本条指令的第一个字节的地址。用在指令中时,它表示本条指令的第一个字节的地址。这里,这里,$+6必须是另一条指令的首地址。否则,汇编程序必须是另一条指令的首地址。否则,汇编程序将指示出错信息。将指示出错信息。当当$用在伪操作的参数字段时,则表示地址计数器的当前用在伪操作的参数字段时,则表示地址计数器的当前值。值。例例4.17 ARRAY DW 1 , 2 , $+4 , 3 , 4 , $+4这里,这里,$表示当前偏移地址。表示当前偏移地址。汇编后的存储区汇编后的存储区如图如图4.9所示所示。地址计数器地址计数器$后一页后一页前一页前一页退出退出目目录录图图4.9

68、 地址计数器地址计数器$在指令中用到在指令中用到$时,时,它只代表该指令的它只代表该指令的首地址,而与首地址,而与$本本身所在的字节无关。身所在的字节无关。后一页后一页前一页前一页退出退出目目录录2. ORG伪操作伪操作定位伪指令控制数据的偏移地址。定位伪指令控制数据的偏移地址。ORG 参数参数或或ORG constant expressionORG伪指令是将当前偏移地址指针指向参数表达的偏移地伪指令是将当前偏移地址指针指向参数表达的偏移地址。址。 ORG 100h ;从从100h处安排数据或程序处安排数据或程序ORG $+10 ;使偏移地址加使偏移地址加10,即跳过,即跳过10个字节空间个字

69、节空间如常数表达式的值为如常数表达式的值为n,则,则ORG伪操作可以使下一个字节伪操作可以使下一个字节的地址成为常数表达式的值的地址成为常数表达式的值n 。常数表达式也可以表示从当前已定义过的符号开始的位移常数表达式也可以表示从当前已定义过的符号开始的位移量,或表示从当前地址计数器值量,或表示从当前地址计数器值$开始的位移量。开始的位移量。举例举例1举例举例2后一页后一页前一页前一页退出退出目目录录例如:例如:VECTORSSEGMENTORG 10;VECT1的偏移地址为的偏移地址为0AH VECT1DW47A5H;VECT2的偏移地址为的偏移地址为14HORG 20VECT2DW0C596

70、HVECTORSENDSORG伪操作举例伪操作举例1后一页后一页前一页前一页退出退出目目录录例如:例如:ORG $+8可以表示跳过了可以表示跳过了8个字节的存储区,亦即建立一个个字节的存储区,亦即建立一个8字节的未字节的未初始化的数据缓冲区。如程序中需要访问该存储区,则可初始化的数据缓冲区。如程序中需要访问该存储区,则可用用label伪操作来定义该缓冲区的如下变量名:伪操作来定义该缓冲区的如下变量名:BUFFERLABELBYTEORG$+8或或BUFFERDB8 DUP(?)ORG伪操作举例伪操作举例2后一页后一页前一页前一页退出退出目目录录3. EVEN伪操作伪操作EVEN;从偶地址开始从

71、偶地址开始EVEN伪指令使下一个变量或指令开始于偶数字节地址。伪指令使下一个变量或指令开始于偶数字节地址。EVEN伪操作可以保证字数组从偶数地址开始。伪操作可以保证字数组从偶数地址开始。例如:例如:DATA_SEGSEGMENTEVENWORD_ARRAYDW 100 DUP(?)(?)DATA_SEGENDS一个字的地址最好从一个字的地址最好从偶地址开始。偶地址开始。后一页后一页前一页前一页退出退出目目录录4. ALIGN伪操作伪操作ALIGN n;从从n的整数倍地址开始的整数倍地址开始ALIGN伪操作是将当前偏移地址指针指向伪操作是将当前偏移地址指针指向n(n是是2的乘方)的乘方)的整数倍

72、的地址。如果原地址指针已指向的整数倍的地址。如果原地址指针已指向n的整数倍地址,的整数倍地址,则不做调整;否则将指针加以则不做调整;否则将指针加以1n-1中的一个数,使地址中的一个数,使地址指针指向下一个指针指向下一个n的整数倍地址。的整数倍地址。ALIGN 2与与EVEN等价等价。后一页后一页前一页前一页退出退出目目录录举例举例Data segmentdata01 db 1,2,3;data01的偏移地址为的偏移地址为0000heven;等价于等价于align 2data02 dw 5;data02的偏移地址为的偏移地址为0004halign 4data03 dd 6;data03的偏移地址

73、为的偏移地址为0008horg $+10hdata04 db abc;data04的偏移地址为的偏移地址为001chData endsalign伪操作举例伪操作举例后一页后一页前一页前一页退出退出目目录录4.2.4 变量和标号的属性变量和标号的属性标号和名字一经定义便具有以下两类三种属性:标号和名字一经定义便具有以下两类三种属性: 段值段值标号和名字对应存储单元的段地址。标号和名字对应存储单元的段地址。 偏移值偏移值标号和名字对应存储单元的偏移地址。标号和名字对应存储单元的偏移地址。 类型类型标号、子程序名的类型可以是标号、子程序名的类型可以是NEAR(近)和(近)和FAR(远)(远),分别表

74、示段内或段间。,分别表示段内或段间。变量名的类型可以是变量名的类型可以是BYTE(字节)、(字节)、WORD(字)和(字)和DWORD(双字)等。(双字)等。地址属性地址属性类型属性类型属性后一页后一页前一页前一页退出退出目目录录变量的类型属性变量的类型属性变量的类型属性(变量的类型属性(type attribute):):用来表示该语句中的用来表示该语句中的每一个数据项的长度(以字节为单位表示)。每一个数据项的长度(以字节为单位表示)。因此,因此,DB/DW/DD/DF/DQ/DT伪操作的类型属性分别为伪操作的类型属性分别为1、2、4、6、8、10。变量表达式的属性和变量是相同的。汇编程序可

75、以用这种变量表达式的属性和变量是相同的。汇编程序可以用这种隐含的类型属性来确定某些指令是字指令还是字节指令。隐含的类型属性来确定某些指令是字指令还是字节指令。后一页后一页前一页前一页退出退出目目录录例例4.14OPER1DB? , ?OPER2DW? , ?MOV OPER1 , 0;字节指令;字节指令MOV OPER2 , 0;字指令;字指令变量的类型属性变量的类型属性后一页后一页前一页前一页退出退出目目录录例例4.15OPER1DB1 , 2OPER2DW1234H , 5678HMOV AX , OPER1+1;类型不匹配;类型不匹配MOV AL , OPER2;类型不匹配;类型不匹配;

76、OPER1+1为字节类型属性,为字节类型属性,OPER2为字类型属性为字类型属性;可以用;可以用PTR、LABLE伪指令来指定操作数的类型。伪指令来指定操作数的类型。操作数类型属性操作数类型属性后一页后一页前一页前一页退出退出目目录录1. 地址操作符地址操作符取得名字或标号的段地址和偏移地址两个属性。取得名字或标号的段地址和偏移地址两个属性。 将括起的表达式作为存储器地址将括起的表达式作为存储器地址$当前偏移地址当前偏移地址:采用指定的段地址寄存器采用指定的段地址寄存器OFFSET 名字名字/标号标号;返回名字或标号的偏移地址;返回名字或标号的偏移地址SEG 名字名字/标号标号;返回名字或标号

77、的段地址;返回名字或标号的段地址举例举例后一页后一页前一页前一页退出退出目目录录org $+10array db 45 , 45h.codemov ax , seg arraymov ds , axmov bx , offset array;等价于等价于 lea bx , arraymov cl , array+4;等效于等效于 mov cl,array4mov ax , es : 2000h地址操作符地址操作符 加加4个字节单元个字节单元后一页后一页前一页前一页退出退出目目录录例例4.27MOV BX , OFFSET OPER_ONE;与;与LEA BX , OPER_ONE等价等价例例4

78、.28如果如果DATA_SEG是从存储器是从存储器05000H地址开始地址开始的一个数据段的段名,的一个数据段的段名,OPER1是该段中的一个变量名。是该段中的一个变量名。MOV BX , SEG OPER1;汇编结果:;汇编结果:MOV BX , 0500H;将;将OPER1所在段的起始偏移地址送入所在段的起始偏移地址送入BX。地址操作符地址操作符后一页后一页前一页前一页退出退出目目录录2. 类型操作符类型操作符类型操作符对名字或标号的类型属性进行有关设置。类型操作符对名字或标号的类型属性进行有关设置。类型名类型名 PTR 名字名字/标号标号THIS 类型名类型名SHORT 标号标号TYPE

79、 名字名字/标号标号SIZEOF 变量名变量名LENGTHOF 变量名变量名后一页后一页前一页前一页退出退出目目录录(1)类型名)类型名 PTR 名字名字/标号标号PTR操作符使名字或标号具有指定的类型。操作符使名字或标号具有指定的类型。类型名可以是类型名可以是BYTE/WORD/DWORD/FWORD/QWORD/TBYTE或者是或者是NEAR/FAR,还可以是由,还可以是由STRUCT、RECORD、UNION以及以及TYPEDEF定义的类型。定义的类型。mov al , byte ptr w_var;w_var是一个字变量是一个字变量jmp far ptr n_label;n_label

80、是一个标号是一个标号使用使用PTR操作符,可以临时改变名字或标号的类型。操作符,可以临时改变名字或标号的类型。后一页后一页前一页前一页退出退出目目录录例例4.29TWO_BYTEDW?ONE_TYPEEQUBYTE PTR TWO_BYTE;ONE_TYPE与与TWO_TYPE具有相同的段、偏移地址具有相同的段、偏移地址;但;但ONE_TYPE为为BYTE类型,类型属性为类型,类型属性为1;TWO_TYPE为为WORD类型,类型属性为类型,类型属性为2OTHER_TYPEEQUBYTE PTR (TWO_BYTE+1);也可写成:;也可写成:;OTHER_TYPEEQUONE_BYTE+1例:

81、例:MOVBYTE PTR BX , 5MOV WORD PTR BX , 5PTR操作符举例操作符举例后一页后一页前一页前一页退出退出目目录录(2)THIS 类型名类型名利用利用THIS说明的操作数具有汇编时的当前逻辑地址,但说明的操作数具有汇编时的当前逻辑地址,但具有指定的类型。具有指定的类型。LABEL伪指令的功能等同于伪指令的功能等同于“EQU THIS”。后一页后一页前一页前一页退出退出目目录录例:例:b_var equ THIS byte;按字节访问变量;按字节访问变量b_var,但与,但与w_var的地址相同的地址相同w_var dw 10 dup(0);按字访问变量;按字访问变

82、量w_varf_jump equ THIS far;用;用f_jump为段间转移(为段间转移(f_jump label far)n_jump: mov ax,w_var;用;用n_jump为段内近转移,但两者指向同一条指令为段内近转移,但两者指向同一条指令THIS操作符举例操作符举例后一页后一页前一页前一页退出退出目目录录例:例:FIRST_TYPEEQUTHIS BYTEWORD_TABLEDW100 DUP(?);FIRST_TYPE与与WORD_TABLE地址相同,但前者为字节地址相同,但前者为字节类型,后者为字类型。类型,后者为字类型。STARTEQUTHIS FARMOV CX ,

83、100;MOV指令具有了一个指令具有了一个FAR属性的地址属性的地址START,这就允许,这就允许其他段的其他段的JMP指令直接跳转到指令直接跳转到START来。来。THIS操作符举例操作符举例后一页后一页前一页前一页退出退出目目录录(3)SHORT 标号标号用来修饰用来修饰JMP指令中转向地址的属性。指令中转向地址的属性。指定标号作为指定标号作为-128+127字节范围内的短转移。字节范围内的短转移。jmp short n_jump当然,如果标号实际上超出了这个范围,则出错。当然,如果标号实际上超出了这个范围,则出错。 对高版本对高版本MASM已无意义已无意义后一页后一页前一页前一页退出退出

84、目目录录(4)TYPE 名字名字/标号标号返回表明名字或标号类型的一个字量数值:返回表明名字或标号类型的一个字量数值:对变量,则返回该变量的以字节数表示的类型。对变量,则返回该变量的以字节数表示的类型。DB/DW/DD/DF/DQ/DT伪操作的类型属性分别为伪操作的类型属性分别为1、2、4、6、8、10。对短、近和远转移依次返回对短、近和远转移依次返回ff01h、ff02h和和ff05h。对常数,返回对常数,返回0。后一页后一页前一页前一页退出退出目目录录例:例:mov ax , TYPE w_var;汇编结果为;汇编结果为mov ax , 2mov ax , TYPE n_jump;汇编结果

85、为;汇编结果为 mov ax , 0ff02h(near标号)标号)例例4.23ARRAYDW1 , 2 , 3ADDSI , TYPE ARRAY;汇编结果为;汇编结果为ADDSI , 2TYPE操作符举例操作符举例后一页后一页前一页前一页退出退出目目录录(5)LENGTH/LENGTHOF 变量变量LENGTH对于变量中使用对于变量中使用DUP的情况,将返回分配给该的情况,将返回分配给该变量的单元数,变量的单元数,对于其他情况则送对于其他情况则送1。SIZE返回返回LENGTH与与TYPE的乘积。的乘积。LENGTHOF返回整个变量的数据项数(即元素数)返回整个变量的数据项数(即元素数)

86、。操作符操作符SIZEOF返回整个变量占用的字节数。返回整个变量占用的字节数。SIZEOF LENGTHOF TYPE 后一页后一页前一页前一页退出退出目目录录例例4.24FEES DW100 DUP(0)MOV CX , LENGTH FEES;汇编结果:;汇编结果:MOV CX , 100MOV DX , LENGTHOFFEES;汇编结果:;汇编结果:MOV DX , 100MOV CX , SIZE FEES;汇编结果:;汇编结果:MOV CX , 200MOV DX , SIZEOF FEES;汇编结果:;汇编结果:MOV DX , 200LENGTH/SIZE后一页后一页前一页前一

87、页退出退出目目录录例例4.25ARRAYDW1 , 2 , 3MOV CX , LENGTH ARRAY;汇编结果:;汇编结果:MOV CX , 1MOV DX , LENGTHOFARRAY;汇编结果:;汇编结果:MOV DX , 3MOV CX , SIZE ARRAY;汇编结果:;汇编结果:MOV CX , 2MOV DX , SIZEOF ARRAY;汇编结果:;汇编结果:MOV DX , 6LENGTH/SIZE后一页后一页前一页前一页退出退出目目录录例例4.26TABLEDBABCDMOV CX , LENGTH TABLE;汇编结果:;汇编结果:MOV CX , 1MOV DX

88、, LENGTHOFTABLE;汇编结果:;汇编结果:MOV DX , 4MOV CX , SIZE TABLE;汇编结果:;汇编结果:MOV CX , 1MOV DX , SIZEOF TABLE;汇编结果:;汇编结果:MOV DX , 4LENGTH/SIZE后一页后一页前一页前一页退出退出目目录录4.3 程序段的定义的相关伪操作程序段的定义的相关伪操作4.3.1DOS的程序结构的程序结构4.3.2处理器选择伪操作处理器选择伪操作4.3.3 段定义伪操作段定义伪操作4.3.4 程序开始和结束伪操作程序开始和结束伪操作后一页后一页前一页前一页退出退出目目录录4.3.1 DOS的程序结构的程序

89、结构EXE程序程序COM程序程序后一页后一页前一页前一页退出退出目目录录1. EXE程序程序利用程序开发工具,通常将生成利用程序开发工具,通常将生成EXE结构的可执行程序结构的可执行程序(扩展名为(扩展名为.EXE的文件)。的文件)。它可以有独立的代码、数据和堆栈段,还可以有多个代码它可以有独立的代码、数据和堆栈段,还可以有多个代码段或多个数据段,程序长度可以超过段或多个数据段,程序长度可以超过64KB,执行起始处,执行起始处可以任意指定。可以任意指定。当当DOS装入或执行一个程序时,装入或执行一个程序时,DOS确定当时主存最低的确定当时主存最低的可用地址作为该程序的装入起始点。此点以下的区域

90、称为可用地址作为该程序的装入起始点。此点以下的区域称为程序段。在程序段内偏移程序段。在程序段内偏移0处,处,DOS为该程序建立一个程为该程序建立一个程序段前缀控制块序段前缀控制块PSP(Program Segment Prefix),它占),它占256(=100h)个字节;而在偏移)个字节;而在偏移100h处才装入程序本身。处才装入程序本身。后一页后一页前一页前一页退出退出目目录录Exe程序的内存映像图程序的内存映像图后一页后一页前一页前一页退出退出目目录录2. COM程序程序COM程序是一种将代码、数据和堆栈段合一的结构紧凑程序是一种将代码、数据和堆栈段合一的结构紧凑的程序,所有代码、数据都

91、在一个逻辑段内,不超过的程序,所有代码、数据都在一个逻辑段内,不超过64KB,因而只能用来编制较小的程序。,因而只能用来编制较小的程序。在程序开发时,需要满足一定要求并采用相应参数才能正在程序开发时,需要满足一定要求并采用相应参数才能正确生成确生成COM结构的程序。结构的程序。COM文件存储在磁盘上是主存的完全影象,不包含重新文件存储在磁盘上是主存的完全影象,不包含重新定位的加载信息,与定位的加载信息,与EXE文件相比其加载速度更快,占用文件相比其加载速度更快,占用的磁盘空间也少。的磁盘空间也少。尽管尽管DOS也为也为COM程序建立程序段前缀程序建立程序段前缀PSP,但由于两种,但由于两种文件

92、结构不同,所以加载到主存后各段设置并不完全一样。文件结构不同,所以加载到主存后各段设置并不完全一样。后一页后一页前一页前一页退出退出目目录录COM程序程序COM文件也是一种可执行文件,由程序本身的二进制代文件也是一种可执行文件,由程序本身的二进制代码组成,它没有码组成,它没有EXE文件所具有的包括有关文件信息的标文件所具有的包括有关文件信息的标题区(题区(header),所以它占有的存储空间比),所以它占有的存储空间比EXE文件要小。文件要小。由于其小而简单,装入速度比由于其小而简单,装入速度比EXE文件要快。文件要快。COM文件不分段,其入口点必须是文件不分段,其入口点必须是100H(其前的

93、(其前的256个字个字节为程序段前缀所在地),且不必设置堆栈段。节为程序段前缀所在地),且不必设置堆栈段。在程序装入时,由系统自动把在程序装入时,由系统自动把SP建立在该段之末。建立在该段之末。对于所有的过程则应定义为对于所有的过程则应定义为NEAR。下面给出下面给出COM文件的源程序格式。文件的源程序格式。后一页后一页前一页前一页退出退出目目录录com程序的内存映像图程序的内存映像图后一页后一页前一页前一页退出退出目目录录;PROGRAM TITLE GOES HERE-;Followed by descriptive phrases;EQU statements go here;*Prog

94、namsegmentorg 100hassume cs:prognam , ds:prognam , es:prognam , ss:prognam;-Main procnear;PROGRAM GOES HEREmov ax , 4c00h;return to DOSint 21h;( or int 20h )COM文件的源程序举例文件的源程序举例1后一页后一页前一页前一页退出退出目目录录;-;DATA goes herePronam ends;*end mainCOM文件的源程序举例文件的源程序举例1后一页后一页前一页前一页退出退出目目录录;PROGRAM TITLE GOES HERE-

95、.model tiny.codeorg 100hStart: jmp beginMain procnear;DATA GOES HEREbegin:;PROGRAM GOES HEREmov ax , 4c00hint 21hendstartCOM文件的源程序举例文件的源程序举例2后一页后一页前一页前一页退出退出目目录录COM文件的生成文件的生成用户在建立源程序后,同样经过汇编、连接形成用户在建立源程序后,同样经过汇编、连接形成EXE文件,文件,然后可以通过然后可以通过EXE2BIN程序来建立程序来建立COM文件,操作方法文件,操作方法如下:如下:Cexe2bin filename 第一个第一

96、个filename给出已形成的给出已形成的EXE文件的文件名,但不必文件的文件名,但不必给出扩展名。给出扩展名。第二个第二个filename即为所要求的即为所要求的COM文件的文件名,必须带文件的文件名,必须带有扩展名,这样就形成了有扩展名,这样就形成了COM文件。文件。在在DOS系统下,可直接在机器上用文件名执行。系统下,可直接在机器上用文件名执行。如果第二个如果第二个filename后没有带扩展名,则生成后没有带扩展名,则生成BIN文件。文件。在在DOS系统运行时,必须先用系统运行时,必须先用rename命令将它改名为命令将它改名为COM文件才能直接运行。文件才能直接运行。COM文件还可以

97、直接在调试程序文件还可以直接在调试程序DEBUG中中用用A或或E命令建立,对于一些短小的程序,这命令建立,对于一些短小的程序,这也是一种相当方便的方法。也是一种相当方便的方法。后一页后一页前一页前一页退出退出目目录录4.3.2 处理器选择伪操作处理器选择伪操作由于由于80x86的所有处理器都支持的所有处理器都支持8086/8088指令系统,但每指令系统,但每一种高档机型又都增加了一些新的指令,因此在编写程序一种高档机型又都增加了一些新的指令,因此在编写程序时都要对所用处理器有一个确定的选择。时都要对所用处理器有一个确定的选择。本组伪操作的就是告诉汇编程序应该选择哪一种指令系统。本组伪操作的就是

98、告诉汇编程序应该选择哪一种指令系统。本组伪操作的位置:本组伪操作的位置:一般放在整个程序的最前面,如不给出处理器选择,一般放在整个程序的最前面,如不给出处理器选择,则默认为则默认为.8086。也可放在程序中,如程序中用了一条也可放在程序中,如程序中用了一条80486所增加的指所增加的指令,则可在该指令的上一行加上令,则可在该指令的上一行加上.486。后一页后一页前一页前一页退出退出目目录录处理器选择伪操作处理器选择伪操作主要有以下几种:主要有以下几种:.8086选择选择8086指令系统指令系统.286选择选择80286指令系统指令系统.286 P选择保护方式下的选择保护方式下的80286指令系

99、统指令系统.386选择选择80386指令系统指令系统.386 P选择保护方式下的选择保护方式下的80386指令系统指令系统.486选择选择80486指令系统指令系统.486 P选择保护方式下的选择保护方式下的80486指令系统指令系统.586选择选择Pentium指令系统指令系统.586 P选择保护方式下的选择保护方式下的Pentium指令系统指令系统指包括特权指令在指包括特权指令在内的指令系统内的指令系统后一页后一页前一页前一页退出退出目目录录4.3.3 段定义伪操作段定义伪操作完整的段定义伪操作完整的段定义伪操作存储模型与简化段定义伪操作存储模型与简化段定义伪操作段组定义伪操作段组定义伪操

100、作段顺序伪操作段顺序伪操作为确定标号和变量(代码段和数为确定标号和变量(代码段和数据段的符号地址)的偏移地址;据段的符号地址)的偏移地址;把有关信息通过目标模块传送给把有关信息通过目标模块传送给连接程序,以便连接程序把不同的连接程序,以便连接程序把不同的段和模块连接在一起,形成一个可段和模块连接在一起,形成一个可执行程序。执行程序。后一页后一页前一页前一页退出退出目目录录1.完整的段定义伪操作完整的段定义伪操作段名段名segment 定位定位 组合组合 段字段字 类别类别 .;语句序列语句序列段名段名ends完整段定义由完整段定义由SEGMENT和和ENDS这一对伪指令实现,这一对伪指令实现,

101、SEGMENT伪指令定义一个逻辑段的开始,伪指令定义一个逻辑段的开始,ENDS伪指令伪指令表示一个段的结束。表示一个段的结束。段定义指令后的段定义指令后的4个关键字用于确定段的各种属性,堆栈个关键字用于确定段的各种属性,堆栈段要采用段要采用stack组合类型,代码段应具有组合类型,代码段应具有code类别,其类别,其他为可选属性参数。他为可选属性参数。如果不指定,则采用默认参数;但如果指定,注意要按照如果不指定,则采用默认参数;但如果指定,注意要按照上列次序。上列次序。数据段、附加段、和堆栈数据段、附加段、和堆栈段中,一般是存储单元的定段中,一般是存储单元的定义、分配等伪操作;义、分配等伪操作

102、;代码段则是指令及伪操作。代码段则是指令及伪操作。后一页后一页前一页前一页退出退出目目录录(1)定位类型定位类型(align_type)指定逻辑段在主存储器中的边界,可为:指定逻辑段在主存储器中的边界,可为:PARA段的起始地址必须从小段边界开始(段的起始地址必须从小段边界开始(xxxx 0000b)。这样,偏移地址可以从)。这样,偏移地址可以从0开始。开始。BYTE 该段可以从任何地址开始(该段可以从任何地址开始(xxxx xxxxb),这),这样起始偏移地址可能不是样起始偏移地址可能不是0。WORD 该段必须从字的边界开始(该段必须从字的边界开始(xxxx xxx0b),即),即段起始地址

103、必须为偶数。段起始地址必须为偶数。DWORD 该段必须从双字的边界开始(该段必须从双字的边界开始(xxxxxx00b)。)。PAGE 该段必须从页的边界开始(该段必须从页的边界开始(0000 0000b),该),该地址能被地址能被256整除。整除。后一页后一页前一页前一页退出退出目目录录默认定位类型默认定位类型简化段定义伪指令的代码和数据段默认采用简化段定义伪指令的代码和数据段默认采用WORD定位,定位,堆栈段默认采用堆栈段默认采用PARA定位。定位。完整段定义伪指令的默认定位属性是完整段定义伪指令的默认定位属性是PARA,其低,其低4位已经位已经是是0,所以默认情况下数据段的偏移地址从,所以

104、默认情况下数据段的偏移地址从0开始。开始。后一页后一页前一页前一页退出退出目目录录(2)组合类型组合类型(combine_type)指定多个逻辑段之间的关系,可为:指定多个逻辑段之间的关系,可为:PRIVATE该段为私有段,在连接时将不与其他模该段为私有段,在连接时将不与其他模块中同名分段合并。块中同名分段合并。这是完整段定义伪指令默认的段这是完整段定义伪指令默认的段组合方式组合方式。PUBLIC该段连接时,可以把不同模块中的同名该段连接时,可以把不同模块中的同名段相邻地连接在一起,其连接次序由连接命令指定。段相邻地连接在一起,其连接次序由连接命令指定。每一分段都从小段的边界开始,因此个模块的

105、原有段每一分段都从小段的边界开始,因此个模块的原有段之间可能存在小于之间可能存在小于16字节的间隙。字节的间隙。这是简化段定义伪这是简化段定义伪指令默认的段组合指令默认的段组合。MEMORY与与PUBLIC同义。同义。后一页后一页前一页前一页退出退出目目录录组合类型组合类型(combine_type)STACK把不同模块中的同名段组合而形成一个把不同模块中的同名段组合而形成一个堆栈段。该段的长度为各原有段的总和,各原有段之堆栈段。该段的长度为各原有段的总和,各原有段之间并无间并无PUBLIC所连接段中的间隙,而且栈顶可自动指所连接段中的间隙,而且栈顶可自动指向连接后形成的大段堆栈段的栈顶。这是

106、向连接后形成的大段堆栈段的栈顶。这是堆栈段必须堆栈段必须具有的段组合具有的段组合。COMMON该段连接时,可以把不同模块中的同名该段连接时,可以把不同模块中的同名段重叠而形成一个段,由于各同名段有相同的起始地段重叠而形成一个段,由于各同名段有相同的起始地址,所以会产生覆盖。址,所以会产生覆盖。COMMON的连接长度是各分段的连接长度是各分段中的最大长度。重叠部分的内容取决于排列在最后一中的最大长度。重叠部分的内容取决于排列在最后一段的内容。段的内容。AT expression 使段地址是表达式所计算出来的使段地址是表达式所计算出来的16位值。位值。但它不能用来指定代码段。但它不能用来指定代码段

107、。后一页后一页前一页前一页退出退出目目录录(3)使用类型使用类型(use_type)为支持为支持32位段而设置的属性,只适用于位段而设置的属性,只适用于386及其后继机型。及其后继机型。它用来说明使用它用来说明使用16位寻址方式还是位寻址方式还是32位寻址方式。它们可位寻址方式。它们可以是:以是:USE16使用使用16位寻址方式。位寻址方式。USE32使用使用32位寻址方式。位寻址方式。当使用当使用16位寻址方式时,段长位寻址方式时,段长=64KB,地址的形式是,地址的形式是16位段地址和位段地址和16偏移地址;当使用偏移地址;当使用32位寻址方式时,段长可位寻址方式时,段长可大大4GB,地址

108、的形式是,地址的形式是16位段地址和位段地址和32位偏移地址。位偏移地址。编写运行于实模式(编写运行于实模式(8086工作方式)的汇编语言程序,必工作方式)的汇编语言程序,必须采用须采用USE16。使用类型的默认项是使用类型的默认项是USE16。后一页后一页前一页前一页退出退出目目录录(4)类别类别(class)在在引号中引号中给出连接时组成段组的类型名,段组的类型名可给出连接时组成段组的类型名,段组的类型名可以是任意名称以是任意名称。类型说明并不能把相同类别的段合并起来,但在连接程序类型说明并不能把相同类别的段合并起来,但在连接程序组织段时,可将所有的同类别段相邻分配。组织段时,可将所有的同

109、类别段相邻分配。大多数大多数MASM程序使用程序使用 code、data和和stack来分别指名代码段、数据段和堆栈段,以保持所有代码和来分别指名代码段、数据段和堆栈段,以保持所有代码和数据的连续。数据的连续。后一页后一页前一页前一页退出退出目目录录指定段寄存器伪指令指定段寄存器伪指令ASSUMEASSUME 段寄存器:段名段寄存器:段名 ,段寄存器名:段名段寄存器名:段名, .通知通知MASM用指定的段寄存器来寻址对应的逻辑段,即明用指定的段寄存器来寻址对应的逻辑段,即明确段和段寄存器的关系。确段和段寄存器的关系。ASSUME说明分配情况。汇编程序会根据数据所在的逻辑说明分配情况。汇编程序会

110、根据数据所在的逻辑段,在需要时自动插入段超越前缀。这是段,在需要时自动插入段超越前缀。这是ASSUME伪指令伪指令的主要功能。的主要功能。其中段寄存器必须是其中段寄存器必须是CS、DS、ES、SS(386及其后继机及其后继机型还有型还有FS和和GS)之一,段名则必须是由)之一,段名则必须是由SEGMENT定义定义的段中的段名。的段中的段名。后一页后一页前一页前一页退出退出目目录录ASSUME伪指令伪指令ASSUME伪指令并不为段寄存器设定初值,连接程序伪指令并不为段寄存器设定初值,连接程序LINK将正确设置将正确设置CS : IP和和SS : SP。由于数据段通常都需要,所以在样板源程序中,首

111、先为由于数据段通常都需要,所以在样板源程序中,首先为DS赋值;如果使用附加段,还要赋值赋值;如果使用附加段,还要赋值ES。ASSUME NOTHING则可取消前面由则可取消前面由ASSUME所指定的所指定的段寄存器。段寄存器。完整段定义举例说明例完整段定义举例说明例4.1。后一页后一页前一页前一页退出退出目目录录例例4.1 ;*data_seg1 segment;定义数据段定义数据段data_seg1 ends;*data_seg2 segment;定义附加段定义附加段data_seg2 ends;*完整段定义完整段定义后一页后一页前一页前一页退出退出目目录录code_seg segment;

112、定义代码段定义代码段assume cs : code_seg , ds : data_seg1 , es : data_seg2start:;程序开始执行的位置程序开始执行的位置;DS寄存器中指定当前数据段地址寄存器中指定当前数据段地址mov ax , data_seg1;数据段首地址存入数据段首地址存入DSmov ds , ax;ES寄存器中指定当前附加段地址寄存器中指定当前附加段地址mov ax , data_seg2;附加段首地址存入附加段首地址存入ESmov es , axcode_seg ends;代码段结束代码段结束;*end start完整段定义完整段定义ASSUME并不能把段地

113、并不能把段地址装入段寄存器中,所以址装入段寄存器中,所以代码段中要有这样的操作。代码段中要有这样的操作。如果有堆栈段,也需把如果有堆栈段,也需把段地址装入段地址装入SS中。中。代码段不需要,代码段代码段不需要,代码段的这一操作是在程序初始的这一操作是在程序初始化时完成的。化时完成的。后一页后一页前一页前一页退出退出目目录录2. 存储模型与简化段定义伪操作存储模型与简化段定义伪操作MODEL伪操作伪操作简化的段定义伪操作简化的段定义伪操作与简化段定义有关的预定义符号与简化段定义有关的预定义符号用用MODEL定义存储模型时的段默认属性定义存储模型时的段默认属性简化段定义举例简化段定义举例后一页后一

114、页前一页前一页退出退出目目录录(1) MODEL伪操作伪操作.MODEL 存储模式存储模式 ,模式选项,模式选项使用简化段定义,必须有存储模式伪指令。使用简化段定义,必须有存储模式伪指令。.model语句必须位于所有段定义语句之前。用来说明在存语句必须位于所有段定义语句之前。用来说明在存储器中是如何安放各个段的。储器中是如何安放各个段的。存储模式决定一个程序的规模,确定进行子程序调用、指存储模式决定一个程序的规模,确定进行子程序调用、指令转移和数据访问的缺省属性。令转移和数据访问的缺省属性。MASM有有7种不同的存储模式:种不同的存储模式: TINY SMALL MEDIUM COMPACT

115、LARGE HUGE FLAT后一页后一页前一页前一页退出退出目目录录 Tiny微型模式是微型模式是MASM 6.0才引入的才引入的用于创建用于创建COM类型程序类型程序,COM程序必须从程序必须从0100H的存的存储单元开始。储单元开始。这种模型一般用于小程序这种模型一般用于小程序。用微型模式编写汇编语言程序时,所有的段地址寄存器都用微型模式编写汇编语言程序时,所有的段地址寄存器都被设置为同一值。被设置为同一值。这意味着代码段、数据段、堆栈段都在这意味着代码段、数据段、堆栈段都在同一个段同一个段内,不大内,不大于于64KB64KB;访问操作数或指令都只需要使用;访问操作数或指令都只需要使用1

116、616位偏移地址。位偏移地址。后一页后一页前一页前一页退出退出目目录录 Small一般的程序一般的程序(例如本书的绝大多数程序示例和习题)都可(例如本书的绝大多数程序示例和习题)都可用这种模式。用这种模式。在小型模式下,一个程序至多在小型模式下,一个程序至多只能有一个代码段和一个数只能有一个代码段和一个数据段据段,每段不大于,每段不大于64KB。这里的这里的数据段数据段是指是指数据段、堆栈段和附加段的总和数据段、堆栈段和附加段的总和,它们,它们共用同一个段基址,总长度不可超过共用同一个段基址,总长度不可超过64KB;因此小模式;因此小模式下程序的最大长度为下程序的最大长度为128KB。访问操作

117、数或指令都只需要使用访问操作数或指令都只需要使用16位偏移地址;这意味着位偏移地址;这意味着诸如指令转移、程序调用以及数据访问等都是诸如指令转移、程序调用以及数据访问等都是近属性近属性(NEAR),即小型模式下的调用类型和数据指针缺省分,即小型模式下的调用类型和数据指针缺省分别为近调用和近指针。别为近调用和近指针。后一页后一页前一页前一页退出退出目目录录 Medium中型模式是与紧凑模式互补的模式。中型模式是与紧凑模式互补的模式。适合于数据量小但代码量大的程序。适合于数据量小但代码量大的程序。中型模式的中型模式的代码段代码段可以超过可以超过64KB,有多个有多个;但;但数据段只数据段只能有一个

118、能有一个不大于不大于64KB的段。的段。这种模式下数据是近访问;但代码则是远访问,即调用类这种模式下数据是近访问;但代码则是远访问,即调用类型缺省是远(型缺省是远(FAR)调用,因为要利用段地址区别多个代)调用,因为要利用段地址区别多个代码段。码段。后一页后一页前一页前一页退出退出目目录录 Compact适合于数据量大但代码量小的程序适合于数据量大但代码量小的程序。紧凑模式下,紧凑模式下,代码段代码段被限制在被限制在一个一个不大于不大于64KB的段内;的段内;而而数据段则可以有多个数据段则可以有多个,超过,超过64KB。这种模式下的这种模式下的代码是近访问代码是近访问,即调用类型缺省仍为近调用

119、;,即调用类型缺省仍为近调用;而而数据则缺省为远(数据则缺省为远(FAR)访问)访问,因为必须用段地址来区,因为必须用段地址来区别多个数据段。别多个数据段。后一页后一页前一页前一页退出退出目目录录 Large较大型程序通常采用的存储模式较大型程序通常采用的存储模式。大型模式允许的大型模式允许的代码段和数据段都有多个代码段和数据段都有多个,都可以超过,都可以超过64KB;但全部的静态数据(不能改变的数据)仍限制在;但全部的静态数据(不能改变的数据)仍限制在64K字节内。字节内。大型模式下的大型模式下的数据和代码都可以远访问。数据和代码都可以远访问。后一页后一页前一页前一页退出退出目目录录 Hug

120、eHUGE(巨型模式)与大型模式基本相同,只是静态数据(巨型模式)与大型模式基本相同,只是静态数据不再被限制在不再被限制在64K字节之内。字节之内。后一页后一页前一页前一页退出退出目目录录 Flat平展模式用于平展模式用于创建一个创建一个32位的程序位的程序,它只能运行在,它只能运行在32位位x86 CPU上。上。DOS下不能下不能使用使用FLAT模式,而编写模式,而编写32位位Windows 9.x或或Windows-NT的程序时,必须采用的程序时,必须采用FLAT模式。模式。MASM5版本不支持这种模型,当版本不支持这种模型,当MASM6可以支持。可以支持。DOS下编程可选择前六种模式,一

121、般可以选用下编程可选择前六种模式,一般可以选用SMALL模式。模式。TINY模式产生模式产生COM程序,其他模式产生程序,其他模式产生EXE程序,程序,FLAT模模式只能用于式只能用于32位程序。位程序。后一页后一页前一页前一页退出退出目目录录Model optionsModel options允许用户指定三种选项:允许用户指定三种选项:高级语言接口高级语言接口操作系统操作系统堆栈距离堆栈距离高级语言接口:该汇编程序作为某一高级语言程序的过程高级语言接口:该汇编程序作为某一高级语言程序的过程而为该高级语言程序调用时,应该用而为该高级语言程序调用时,应该用C,BASIC,FORTRAN,PASC

122、AL等来说明。等来说明。操作系统:说明程序运行于哪个操作系统之下,可用操作系统:说明程序运行于哪个操作系统之下,可用OS_DOS或或OS_OS2来说明,默认项是来说明,默认项是OS_DOS。后一页后一页前一页前一页退出退出目目录录Model options堆栈距离:可用堆栈距离:可用NEARSTACK 或或FARSTACK来说明。来说明。NEARSTACK是指把堆栈段和数据段组合到一个是指把堆栈段和数据段组合到一个DGROUP段中,段中,DS和和SS均指向均指向DGROUP段;段;FARSTACK是指堆栈段和数据段并不合并。是指堆栈段和数据段并不合并。当存储模型为当存储模型为TINY、SMAL

123、L、MEDIUM和和FLAT时,默时,默认项是认项是NEARSTACK;当存储模型为;当存储模型为COMPACT、LARGE和和HUGE时,默认项是时,默认项是FARSTACK。例如:例如:. MODEL SMALL , C. MODEL LARGE , PASCAL , OS_DOS , FARSTACK后一页后一页前一页前一页退出退出目目录录(2)简化的段定义伪操作简化的段定义伪操作汇编程序给出的标准段有下列几种:汇编程序给出的标准段有下列几种:Code代码段代码段Initialized data初始化数据段初始化数据段Uninitialized data未初始化数据段未初始化数据段Far

124、 initialized data远初始化数据段远初始化数据段Far uninitialized data远未初始化数据段远未初始化数据段Constants常数段常数段Stack堆栈段堆栈段这种分段方法把数据段分得更细,可便于与高级语言的兼这种分段方法把数据段分得更细,可便于与高级语言的兼容。在为高级语言编写某一个汇编过程时,可采用这种标容。在为高级语言编写某一个汇编过程时,可采用这种标准段模式。准段模式。后一页后一页前一页前一页退出退出目目录录简化段定义伪操作简化段定义伪操作若编写一个独立的汇编语言程序,不需要细分。一般采用若编写一个独立的汇编语言程序,不需要细分。一般采用下述三个标准段即可

125、。下述三个标准段即可。.CODE.DATA.STACK简化段定义伪指令简化段定义伪指令指明一个逻辑段的开始,同时自动结束指明一个逻辑段的开始,同时自动结束前面的一个段前面的一个段。采用简化段定义伪指令前,需有采用简化段定义伪指令前,需有.model语句。语句。使用简化段定义,各段名称和其他用户所需的信息可以使使用简化段定义,各段名称和其他用户所需的信息可以使用用MASM预定义符号,例如:预定义符号,例如:data表示由表示由.data等定义的等定义的数据段的段名数据段的段名。后一页后一页前一页前一页退出退出目目录录对于以上标准段,可有以下简化段伪操作:对于以上标准段,可有以下简化段伪操作:Co

126、de name对于一个代码段的模型,段名为可选项;对于一个代码段的模型,段名为可选项;对于多个代码段的模型,则应为每个代码段指定段名。对于多个代码段的模型,则应为每个代码段指定段名。DATADATA ?未初始化的数据段未初始化的数据段FARDATA name可指定段名。如不指定,则将以可指定段名。如不指定,则将以FAR_DATAM命名。命名。FARDATA ? name可指定段名。如不指定,则将以可指定段名。如不指定,则将以FAR_DATAM命名。命名。CONSTSTACK size可指定堆栈段大小。如不指定,则默认值为可指定堆栈段大小。如不指定,则默认值为1KB。后一页后一页前一页前一页退出

127、退出目目录录堆栈段伪指令堆栈段伪指令.STACK 大小大小堆栈段伪指令堆栈段伪指令.STACK创建一个堆栈段,段名是:创建一个堆栈段,段名是:stack。它的参数指定堆栈段所占存储区的字节数,默认是它的参数指定堆栈段所占存储区的字节数,默认是1KB(= 1024 = 400h字节)。字节)。后一页后一页前一页前一页退出退出目目录录数据段伪指令数据段伪指令.DATA数据段伪指令数据段伪指令.data创建一个数据段,段名是:创建一个数据段,段名是:_DATA。它。它用于定义具有初值的变量,当然也允许定义无初值的变量。用于定义具有初值的变量,当然也允许定义无初值的变量。无初值变量可以安排在另一个段中

128、,它用无初值变量可以安排在另一个段中,它用.data?伪指令创伪指令创建,数据段名是:建,数据段名是:_BSS。. const伪指令用于建立只读的常量数据段(段名:伪指令用于建立只读的常量数据段(段名:CONST)。)。后一页后一页前一页前一页退出退出目目录录代码段伪指令代码段伪指令.CODE 段名段名代码段伪指令代码段伪指令.code创建一个代码段,它的参数指定该代创建一个代码段,它的参数指定该代码段的段名。码段的段名。如果没有给出段名,则采用默认段名:如果没有给出段名,则采用默认段名:在在TINY、SMALL、COMPACT和和FLAT模式下,默认模式下,默认的代码段名是:的代码段名是:_

129、TEXT。在在MEDIUM、LARGE和和HUGE模式下,默认的代码段模式下,默认的代码段名是:模块名名是:模块名_TEXT。后一页后一页前一页前一页退出退出目目录录(3)与简化段定义有关的预定义符与简化段定义有关的预定义符号号汇编程序给出了与简化段定义有关的一组预定义符号,它汇编程序给出了与简化段定义有关的一组预定义符号,它们可在程序中出现,并由汇编程序识别使用。们可在程序中出现,并由汇编程序识别使用。如在完整段定义下,在程序一开始,需要用段名装入相应如在完整段定义下,在程序一开始,需要用段名装入相应寄存器,如例寄存器,如例4.1中的相应语句。中的相应语句。若用简化段定义,则数据段只用若用简

130、化段定义,则数据段只用.DATA来定义,而并未给来定义,而并未给出段名,此时可用出段名,此时可用mov ax ,datamov ds , ax另外,还有一些预定义符号,它们也可与条件汇编伪操作另外,还有一些预定义符号,它们也可与条件汇编伪操作相配合,以帮助用户编写一些较为复杂的代码。这里不作相配合,以帮助用户编写一些较为复杂的代码。这里不作介绍。介绍。预定义符预定义符号号data给给出了段名出了段名后一页后一页前一页前一页退出退出目目录录(4)用用MODEL定义存储模型时的定义存储模型时的段默认属性段默认属性表表4.1给出了使用给出了使用MODEL伪操作时的段默认情况。伪操作时的段默认情况。模

131、型模型列给出了可定义的列给出了可定义的7种模型;种模型;伪操作伪操作列给出了对应每一种模型可定义列给出了对应每一种模型可定义7种段的伪操作;种段的伪操作;名字名字列给出了各段所用段名;列给出了各段所用段名;定位定位列给出了段的起始地址边界的类型;列给出了段的起始地址边界的类型;组合组合列给出了段的组合类型;列给出了段的组合类型;类类列给出了各段所属类;列给出了各段所属类;组组列给出各种模型下所建立的数组。列给出各种模型下所建立的数组。后一页后一页前一页前一页退出退出目目录录表表4.1 用用MODEL伪操作时的段默认伪操作时的段默认属性(属性(1)后一页后一页前一页前一页退出退出目目录录表表4.

132、1 用用MODEL伪操作时的段默认伪操作时的段默认属性(属性(2)后一页后一页前一页前一页退出退出目目录录表表4.1 用用MODEL伪操作时的段默认伪操作时的段默认属性(属性(3)后一页后一页前一页前一页退出退出目目录录(5)简化段定义举例简化段定义举例例例4.2例例4.3例例4.4后一页后一页前一页前一页退出退出目目录录例例4.2 .MODEL SMALL.STACK 100H;定义堆栈段;定义堆栈段.DATA;定义数据段;定义数据段.CODE;定义代码段;定义代码段START:MOV AX , DATA;数据段首地址;数据段首地址MOV DS , AX;装入;装入DS寄存器寄存器MOV A

133、X , 4C00HINT 21HEND START简化段定义简化段定义后一页后一页前一页前一页退出退出目目录录例例4.3.MODEL SMALL.STACK 100H.CONST;定义常数段;定义常数段.DATA;定义数据段;定义数据段.CODE;定义代码段;定义代码段START:MOV AX , DGROUP;数据段首地址;数据段首地址MOV DS , AX;装入;装入DS寄存器寄存器MOV AX , 4C00HINT 21HEND START简化段定义简化段定义后一页后一页前一页前一页退出退出目目录录例例4.4 .MODEL SMALL.FARDATA.CODESTART:MOV AX ,

134、 DATAMOV DS , AXMOV AX , FARDATAMOV ES , AXASSUME ES:FARDATAMOV AX , 4C00HINT 21HEND START简化段定义简化段定义.FARDATA和和.FARDATA?建立的是独立的段,建立的是独立的段,所以必须为它们建立一个段寄存器所以必须为它们建立一个段寄存器(常用(常用ES)。)。后一页后一页前一页前一页退出退出目目录录3. 段组定义伪操作段组定义伪操作汇编程序自动地把各数据段组成一个汇编程序自动地把各数据段组成一个64KB段组段组DGROUP,以便程序在访问各数据段时使用一个数据段寄存器,以便程序在访问各数据段时使用

135、一个数据段寄存器DS。格式:格式:grpname DGROUP segname, segname其中,其中,grpname为段组名,为段组名,segname则为段名。则为段名。DGROUP伪操作允许用户自行指定段组。伪操作允许用户自行指定段组。定义段组后,段组内各段就统一为一个段地址,各段定义定义段组后,段组内各段就统一为一个段地址,各段定义的变量和标号的偏移地址就相对于段组基地址计算。的变量和标号的偏移地址就相对于段组基地址计算。offset操作符取变量和标号相对于段组的偏移地址,如果操作符取变量和标号相对于段组的偏移地址,如果没有段组则取得相对于段的偏移地址。没有段组则取得相对于段的偏移地

136、址。offset后可以跟段组中的某个段名,表示该段最后一个字后可以跟段组中的某个段名,表示该段最后一个字节后面字节相对于段组的偏移地址。节后面字节相对于段组的偏移地址。例例4.5后一页后一页前一页前一页退出退出目目录录例例4.5 DSEG1 SEGMENT WORD PUBLIC DATADSEG1 ENDSDSEG2 SEGMENT WORD PUBLIC DATADSEG2 ENDSDATAGROUP GROUP DESG1 , DSEG2CSEG SEGMENT PARA PUBLIC CODEASSUME CS : CSEG , DS : DATAGROUP段组定义段组定义后一页后一页

137、前一页前一页退出退出目目录录START: MOV AX , DATAGROUPMOV DS , AXMOV AX , 4C00HINT 21HCSEG ENDSEND START段组定义段组定义后一页后一页前一页前一页退出退出目目录录;将两个数据段;将两个数据段data1和和data2合并到一个合并到一个;datagroup组中。组中。stacksegsegment stackdb 256 dup(?)stacksegendsdata1 segment word public constconst1 dw 100data1 endsdata2 segment word public varsv

138、ar1dw ?data2 endsdatagroup group data1,data2;进行段组合;进行段组合段组举例段组举例1/3后一页后一页前一页前一页退出退出目目录录codeseg segment para public codeassume cs:codeseg , ds:datagroup , ss:stacksegstart:mov ax,datagroupmov ds,ax;对段组寻址;对段组寻址mov ax,const1;ax=100mov var1,ax;var1=100mov ax,offset var1;ax=2mov ax,offset data1 ;ax=2mov

139、ax,offset data2 ;ax=4段组举例段组举例2/3后一页后一页前一页前一页退出退出目目录录assume ds:data2mov ax,data2mov ds,axmov ax,var1;ax=100mov ax,offset var1;ax=2mov ax,4c00hint 21hcodeseg endsend start段组举例段组举例3/3后一页后一页前一页前一页退出退出目目录录4. 段顺序伪操作段顺序伪操作.SEG;按照源程序的各段顺序按照源程序的各段顺序.DOSSEG ;按照微软使用的标准按照微软使用的标准DOS规定规定.ALPHA;按照段名的字母顺序按照段名的字母顺序段

140、顺序伪指令确定各逻辑段在主存的前后位置。段顺序伪指令确定各逻辑段在主存的前后位置。完整段定义格式中,默认按照源程序各段的书写顺序安排完整段定义格式中,默认按照源程序各段的书写顺序安排(即(即.seg)。)。采用采用.model伪指令的简化段定义格式,则是规定的标准伪指令的简化段定义格式,则是规定的标准DOS程序顺序(程序顺序( 即即.dosseg ):):代码段代码段 数据段数据段 堆栈段堆栈段主存地址低端主存地址低端 高端高端例子例子后一页后一页前一页前一页退出退出目目录录;要求将堆栈区设置在数据段中;要求将堆栈区设置在数据段中dsegsegment word public dataorg

141、100h;设定堆栈段起始段内偏移地址设定堆栈段起始段内偏移地址dw 200 dup(?)topsp equ this word;定义栈顶指针定义栈顶指针array dw 100 dup(5868h)dsegendscsegsegment codeassume cs:cseg , ds:dseg , ss:dseg;dseg既是数据段又是堆栈段既是数据段又是堆栈段段顺序举例段顺序举例1/2后一页后一页前一页前一页退出退出目目录录start:mov ax,dsegmov ds,axmov ss,ax;数据段与堆栈段具有相同的段地址数据段与堆栈段具有相同的段地址mov sp,offset topsp

142、mov cx,100xor si,siagain:push arraysiinc siinc siloop againmov ah,4chint 21hcsegendsend start段顺序举例段顺序举例2/2后一页后一页前一页前一页退出退出目目录录4.3.4 程序开始和结束伪操作程序开始和结束伪操作程序开始处的伪操作程序开始处的伪操作NAME伪操作伪操作TITLE伪操作伪操作汇编结束伪操作汇编结束伪操作END伪操作伪操作定义程序的入口点和出口点伪操作定义程序的入口点和出口点伪操作.STARTUP伪操作伪操作EXIT伪操作伪操作后一页后一页前一页前一页退出退出目目录录1. 程序开始处的伪操作

143、程序开始处的伪操作在程序的开始处可以用在程序的开始处可以用NAME或或TITLE作为模块的名字。作为模块的名字。格式:格式:NAME module_name或或TITLE text汇编程序将以给出的汇编程序将以给出的module_name或或text中的前六个字符中的前六个字符作为模块名。作为模块名。Text最多可有最多可有60个字符。个字符。TITLE伪操作可指定列表文件的每一页上打印的标题。伪操作可指定列表文件的每一页上打印的标题。如果程序中既无如果程序中既无NAME又无又无TITLE伪操作,则将用源文件伪操作,则将用源文件名作为模块名。名作为模块名。NAME或或TITLE伪操作伪操作并不

144、是必要的并不是必要的,但一般经常使用,但一般经常使用TITLE,以便在列表文件中打印出标题来。,以便在列表文件中打印出标题来。后一页后一页前一页前一页退出退出目目录录2. 汇编结束伪操作汇编结束伪操作表示源程序结束的伪操作。表示源程序结束的伪操作。格式:格式:END label可选的标号可选的标号label指示程序开始执行的起始地址指示程序开始执行的起始地址,连接程序,连接程序将据此设置将据此设置CS : IP值。如果多个程序模块相连接,则只有值。如果多个程序模块相连接,则只有主程序要使用标号,其他子程序模块则只用主程序要使用标号,其他子程序模块则只用END而不必指而不必指定标号。定标号。指示

145、汇编程序指示汇编程序MASM到此到此结束汇编过程结束汇编过程。源程序的最后必须有一条源程序的最后必须有一条END语句。语句。例例4.14.5已使用已使用END START表示程序结束,而程序则从表示程序结束,而程序则从START开始执行。开始执行。后一页后一页前一页前一页退出退出目目录录3. 程序开始伪操作程序开始伪操作MASM6.0增加了这个伪操作。增加了这个伪操作。.STARTUP用来定义程序的初始入口点,并且产生用来定义程序的初始入口点,并且产生设置设置DS,SS和和SP的代码的代码。如果程序中使用了如果程序中使用了.STARTUP,则结束程序的,则结束程序的END为操为操作中不必再指定

146、程序的入口点标号。作中不必再指定程序的入口点标号。后一页后一页前一页前一页退出退出目目录录.STARTUP伪操作伪操作按照按照CPU类型、存储类型、存储模式、操作系统和堆模式、操作系统和堆栈类型,产生程序开栈类型,产生程序开始执行的代码;同时始执行的代码;同时还指定程序开始执行还指定程序开始执行的起始点。的起始点。在在DOS下,还将设置下,还将设置DS值,调整值,调整SS和和SP值。值。mov dx,dgroupmov ds,dx;设置设置DSmov bx,sssub bx,dxshl bx,1shl bx,1shl bx,1shl bx,1cli;关中断关中断mov ss,dx;调整调整SS

147、和和SPadd sp,bxsti;开中断开中断mov dx,datamov ds,dx后一页后一页前一页前一页退出退出目目录录返回返回4. 程序中止伪操作程序中止伪操作MASM6.0增加了这个伪操作。增加了这个伪操作。.EXIT return_value用来产生用来产生退出程序并返回操作系统退出程序并返回操作系统的代码。的代码。Return_value为返回给操作系统的值,常用为返回给操作系统的值,常用0作为返回作为返回值。值。例如例如.exit 0对应的代码是:对应的代码是:mov ax,4c00hint 21hDOS功能调用的功能调用的4ch子功能(返回子功能(返回DOS):):入口参数:

148、入口参数:AH4ch,AL返回数码返回数码退出程序与汇编结束退出程序与汇编结束是两码事是两码事后一页后一页前一页前一页退出退出目目录录本章教学要求(本章教学要求(1)1.掌握汇编语言语句格式。掌握汇编语言语句格式。2.掌握简化段定义(或完整段定义)源程序格式。掌握简化段定义(或完整段定义)源程序格式。3.掌掌握握常常量量表表达达、变变量量定定义义及及应应用用,变变量量、标标号号和和逻逻辑辑段段的属性。的属性。4.了解数值表达式和了解数值表达式和DOS的程序结构。的程序结构。5.掌掌握握汇汇编编语语言言源源程程序序的的编编辑辑、汇汇编编、连连接接和和调调试试的的开开发发方法。方法。后一页后一页前

149、一页前一页退出退出目目录录本章教学要求(本章教学要求(2)6.掌握基本伪指令和操作符:掌握基本伪指令和操作符:EQU、*/、DBDWDD、?、?DUPORG$、OFFSETSEGPTR.MODEL.STACK.DATA.CODEENDSEGMENT/ENDS后一页后一页前一页前一页退出退出目目录录本章教学要求(本章教学要求(3)7.了解不常使用伪指令和操作符:了解不常使用伪指令和操作符:.RADIX;逻辑、移位和关系运算符;逻辑、移位和关系运算符;DFDQDT;EVENALIGN;THISSHORTTYPESIZEOFLENGTHOF;ASSUMEGROUP;.SEG.DOSSEG.ALPHA后一页后一页前一页前一页退出退出目目录录

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 研究生课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号