汇编语言上机指导_第1页
汇编语言上机指导_第2页
汇编语言上机指导_第3页
汇编语言上机指导_第4页
汇编语言上机指导_第5页
已阅读5页,还剩176页未读 继续免费阅读

下载本文档

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

文档简介

汇编语言程序设计教学重点第3章学习了8086硬指令,第4章介绍MASM根本的伪指令〔伪操作〕。第4章重点掌握:程序的格式、开发方法参数的表达、变量的定义变量和标号的属性硬指令和伪指令硬指令——使CPU产生动作、并在程序执行时才处理的语句,就是第3章学习的处理器指令。伪指令〔伪操作:Directive〕——不产生CPU动作、在程序执行前由汇编程序处理的说明性语句,例如,处理器选择、定义程序模式、定义数据、分配存储区、指示程序结束等等。伪指令与具体的处理器类型无关,但与汇编程序的版本有关。第四章汇编语言程序格式4.1 汇编语言程序的开发4.2 参数、变量、标号及相关伪操作4.3 程序段的定义的相关伪操作后一页前一页退出4.1汇编语言程序的开发4.1.1 汇编程序功能4.1.2 汇编语言程序的语句格式4.1.3 汇编语言程序的程序格式4.1.4 汇编语言程序的上机过程后一页前一页目录退出4.1.1汇编程序功能汇编语言程序的建立及汇编过程汇编程序的主要功能常用的汇编程序后一页前一页目录退出〔1〕汇编语言程序的建立及汇编过程汇编语言程序的建立及汇编过程,如图4.1所示。在计算机上运行汇编语言程序的步骤是:用编辑程序建立ASM源文件;用MASM程序把ASM文件转换成OBJ文件;用LINK程序把OBJ文件转换成EXE文件;用DOS命令直接键入文件名就可执行该程序。后一页前一页目录退出〔2〕汇编程序的主要功能检查源程序。测出源程序中的语法错误,并给出出错信息。产生源程序的目标程序,并可给出列表文件〔同时列出汇编语言和机器语言的文件,称为LST文件〕。展开宏指令。后一页前一页目录退出〔3〕常用的汇编程序Microsoft公司推出的宏汇编程序MASM〔MacroAssembler〕;Borland公司推出的TASM〔TurboAssembler〕。本课程采用MASM6.11后一页前一页退出目录图4.1汇编语言程序的建立及汇编过程编辑程序汇编程序连接程序MASMLINKPROGR.ASM文件PROGR.OBJ文件PROGR.EXE文件返回4.1.2汇编语言程序的语句格式汇编语言语句格式: [name] operation operand [;comment]执行性语句——由硬指令构成的语句,它通常对应一条机器指令,出现在程序的代码段中:

标号:硬指令助记符 操作数,操作数 ;注释说明性语句——由伪指令构成的语句,它通常指示汇编程序如何汇编源程序:

名字伪指令助记符参数,参数,… ;注释后一页前一页退出目录1.名字〔name〕项源程序中用以下字符来表示名字项〔name〕:字母 A~Z数字 0~9专用字符 ?,·,@,-,$注意:名字不能以数字开头。名字中如果用到·,那么必须是第一个字符。汇编程序只识别名字的前31个字符。默认情况下,汇编程序不区别标识符中的字母大小写。后一页前一页退出目录标号、名字与标识符name可以是标号或变量。它们都用来表示本语句的符号地址,都是可有可无的,只有当需要用到符号地址来访问该语句时,它才需要出现。标号:在代码段中定义,是反映硬指令位置〔逻辑地址〕的标识符,后跟一个冒号分隔。经常在转移指令或CALL指令的操作数字段出现,用以表示转向地址。后一页前一页退出目录标号、名字与标识符名字:是反映伪指令位置〔逻辑地址〕和属性的标识符,后跟空格或制表符分隔,没有冒号。可用LABEL或EQU伪操作来定义。还可以作为过程名定义〔第六章中介绍〕。标识符〔Identifier〕:每个标识符的定义是唯一的,还不能是汇编语言采用的保存字。后一页前一页退出目录2.保存字保存字〔ReservedWord〕是汇编程序已经利用的标识符,主要有:硬指令助记符——例如:MOV、ADD伪指令助记符——例如:DB、EQU操作符——例如:OFFSET、PTR存放器名——例如:AX、CS预定义符号——例如:@data后一页前一页退出目录3.指令助记符硬指令助记符可以是任何一条处理器指令,也可以是一条宏指令伪指令助记符将在本章和下章学习。前一章引入的定义字节数据和字符串的DB就是伪指令。后一页前一页退出目录4.操作数与参数处理器指令的操作数可以是立即数、存放器和存储单元。伪指令的参数可以是常数、变量名、表达式等,可以有多个,参数之间用逗号分隔。后一页前一页退出目录5.注释〔comment〕项注释〔comment〕项:用来说明程序或语句的功能。;为注释的开始。;可以从一行的第一个字符开始,此时整行都是注释,常用来说明下面一段程序的功能。汇编程序在翻译源程序时将跳过该局部,不对它们做任何处理。后一页前一页退出目录形成良好的编程习惯,写注释是重要的一项!6.分隔符语句的4个组成局部要用分隔符分开。标号后用冒号,注释前用分号。操作数之间和参数之间使用逗号分隔。其他局部通常采用空格或制表符。多个空格和与一个制表符的作用相同。MASM支持续行符“\〞。后一页前一页退出目录4.1.3汇编语言程序的程序格式完整的汇编语言源程序由段组成。一个汇编语言源程序可以包含假设干个代码段、数据段、附加段或堆栈段,段与段之间的顺序可随意排列。需独立运行的程序必须包含一个代码段,并指示程序执行的起始点,一个程序只有一个起始点。所有的可执行性语句必须位于某一个代码段内,说明性语句可根据需要位于任一段内。通常,程序还需要一个堆栈段。汇编语言源程序段定义格式有两种:简化段定义格式——从MASM5.0开始支持完整段定义格式——MASM5.0以前就具有后一页前一页退出目录;PROGRAMTITLEGOESHERE-;Followedbydescriptivephrases;EQUSTATEMENTSGOHERE;****************************************************Datareasegment ;definedatasegment;DATAGOESHEREDatareaends;***************************************************Prognamsegment ;definecodesegment;汇编语言源程序举例1后一页前一页退出目录Main proc far ;mainpartofprogram assume cs:program,ds:datareaStart: ;startingexecutionaddress;setupstackforreturn

pushds ;saveolddatasegment subax,ax ;putzeroinax pushax ;saveitonstack;setDSregistertocurrentdatasegment movax,datarea ;datareasegmentaddr movds,ax ;intoDSregister;MAINPARTOFPROGRAMGOESHERE汇编语言源程序举例1首先把DS的内容和0作为段地址和偏移地址入栈,以便在程序结束时用RET指令返回DOS,这是一种工作方式。如果在主程序开始时没有这三条指令在堆栈段建立返回信息,那么在程序结束时就不能直接用RET返回指令,而应该用DOS功能调用4CH:MOVAX,4C00HINT21H这种方式更加普遍。后一页前一页退出目录

ret ;returntoDOSMain endp ;endofmainpartofprogram;Sub1 proc near ;definesubprocedure;SUBROUTINEGOESHERESub1 endp ;endofsubprocedure;Prognamend ;endofcodesegment;****************************************************

endstart ;endofassembly汇编语言源程序举例1后一页前一页退出目录 .modelsmall ;definememorymodel .stack100h ;definestacksegment .data ;definedatasegment;DATAGOESHERE .code ;definecodesegmentMain proc farStart: movax,@data ;datasegmentaddr movds,ax ;intoDSregister汇编语言源程序举例2后一页前一页退出目录;MAINPARTOFPROGRAMGOESHERE

movax,4c00h int21h ;returntoDOSMain endp ;endofmainprogram

endstart ;endofassembly汇编语言源程序举例2后一页前一页退出目录4.1.4汇编语言程序的上机过程建立汇编语言的工作环境建立ASM文件;用MASM程序产生OBJ文件;用LINK程序产生EXE文件;程序的执行。后一页前一页退出目录1.建立汇编语言的工作环境为运行汇编语言程序至少要在磁盘上建立以下文件:编辑程序,如EDIT.EXE汇编程序,如MASM.EXE连接程序,如LINK.EXE调试程序,如DEBUG.COM必要时,还可建立如CREF.EXE,EXE2BIN.EXE等文件。后一页前一页退出目录2.建立ASM文件用编辑程序EDIT在磁盘上建立如下的源程序EX_MOVS.ASM。例4.30把40个字母a的字符串从源缓冲区传送到目的缓冲区。后一页前一页退出目录;PROGRAMTITLESGOESHERE-ex_movs;***************************************************Data segment ;definedatasegment source_buffer db 40dup(‘a’)Data ends;***************************************************Extra segment ;defineextrasegment dest_buffer db 40dup(?)Extra ends;***************************************************Code segment ;definecodesegment;汇编语言源程序.ASM后一页前一页退出目录Main proc far ;mainpartofprogram assumecs:code,ds:data,es:extraStart: ;startingexecutionaddress;setupstackforreturn

pushds ;saveolddatasegment subax,ax ;putzeroinax pushax ;saveitonstack汇编语言源

程序.ASM后一页前一页退出目录;setDSregistertocurrentdatasegment movax,datarea ;datareasegmentaddr movds,ax ;intoDSregister;setESregistertocurrentextrasegment movax,extra ;extrasegmentaddr moves,ax ;intoESregister;MAINPARTOFPROGRAMGOESHERE汇编语言源

程序.ASM后一页前一页退出目录 leasi,source_buffer ;putoffsetaddrofsource ;bufferinSI leadi,dest_buffer ;putoffsetaddrofdest ;bufferinDI cld ;setDFflagtoforward movcx,40 ;putcountinCX repmovsb ;moveentirestring ret ;returntoDOSMain endp ;endofcodesegment;Code ends ;endofcodesegment;*************************************************** end start ;endofassembly后一页前一页退出目录3.用MASM程序产生OBJ文件用汇编程序对源程序文件汇编,产生二进制的目标文件〔.OBJ文件〕,其操作与汇编程序答复如下:C>masmex_movsMicrosoft(R)MacroAssemblerVersion5.00Copyritht(C)MicrosoftCorp1981-1985,1987,Allrightsreserved.Objectfilename[ex_movs,obj]:Sourcelisting[NUL.LST]:ex_movsCross-reference[NUL.CRF]:ex_movs 51646+447778Bytessymbolspacefree 0WarningErrors 0SevereErrorsOBJ文件列表文件(.LST)段名表和符号表文件(.CRF文件)后一页前一页退出目录例4.30的列表文件EX_MOVS.LST。这个文件同时列出了源程序和机器语言程序清单,并给出符号表,方便程序调试。这个文件可有可无,如果不需要,那么直接在[NUL.LST]:后敲回车;否那么,可答复文件名,这里是ex_movs。程序请看教材P148-151。后一页前一页退出目录例4.30的交叉引用表EX_MOVS.REF文件。汇编程序提供的第三个文件是CRF文件,用来产生交叉引用表REF。交叉引用表给出了用户定义的所有符号,对于每个符号列出了其定义所在行号〔加上#〕及引用的行号。CRF文件,为大程序的修改提供方便,而一般较小的程序那么可不使用,所以可直接在[NUL.REF]:后直接敲回车;如果希望建立交叉引用表,那么应用文件名来答复,这里是ex_movs,这样就产生了EX_MOVS.CRF文件。为了建立交叉引用表,必须调用CREF程序,所以如果需要就应该从系统中把CREF.EXE文件COPY到你的磁盘上。具体做法和程序,请看教材P151-152。后一页前一页退出目录4.用LINK程序产生EXE文件OBJ文件不是可执行文件,还需要用连接程序LINK把OBJ文件转换为可执行的EXE文件。如果一个程序是由多个模块组成时,也要通过连接程序LINK把它们连接在一起,操作方法及机器答复如下:C>linkex_movsMicrosoft(R)MacroAssemblerVersion5.00Copyritht(C)MicrosoftCorp1981-1985,1987,Allrightsreserved.RunFile[EX_MOVS.EXE]:ListFile[NUL.MAP]:ex_movsLibraries[.LIB]:LINK: WarningL4021:nostacksegmentEXE文件列表文件(.MAP)库文件LIB后一页前一页退出目录LINK程序的文件LINK程序有两个输入文件OBJ和LIB。OBJ是需要连接的目标文件;LIB是程序中要用到的库文件,如无需要,那么直接敲回车。LINK程序有两个输出文件EXE和MAP。EXE是最后得到的可执行文件;直接敲回车。MAP是连接程序的列表文件,又称为连接映像〔linkmap〕,它给处每个段在存储器中的分配情况。后一页前一页退出目录例4.30的连接映像EX_MOVS.MAP文件LINK:warningL4021:nostacksegmentStart Stop Length Name class00000H 00027H 00028H DATA 00030H 00057H 00028H EXTRA00060H 0007CH 0001DH CODEProgramentrypointat0006:0000连接程序在给出的无堆栈段的警告性错误并不映像程序的运行。到此,连接过程已结束,可以执行EX_MOVS程序了。后一页前一页退出目录5.程序的执行在建立了EXE文件后,就可以直接从DOS执行程序,如下所示:C>ex_movsC>程序运行结束并返回DOS。如果用户程序中,有在终端显示结果的语句,那么程序运行结束,可在终端看到运行结果。EX_MOVS程序没有显示结果的语句,那么可通过调试程序DEBUG的D命令来检查附加段是否已得到了从源缓冲区传来的40个字母a。后一页前一页退出目录4.2参数、变量、标号及相关伪操作4.2.1 数值型参数4.2.2 数据定义及存储器分配伪操作4.2.3地址计数器与对准伪操作4.2.4 变量和标号的属性后一页前一页退出目录本节重点本节详细讨论汇编语言程序语句的主要局部:参数变量名标号并引出相关的伪指令和操作符。本节重点掌握:常数的表达变量定义伪指令DB/DW/DD地址操作符和类型操作符后一页前一页退出目录4.2.1数值型参数在源程序语句格式的4个组成局部中,参数是指令的操作对象〔在学习硬指令时被称为操作数〕,由一个或多个表达式组成,参数之间用逗号分隔。参数根据指令不同可以没有,可以有1个、2个或多个。汇编语言程序中,参数可以是常数、存放器、标号、变量或由表达式组成。指令参数有数值型,它的主要形式是常数和数值表达式。硬指令的操作数有立即数;立即数就要用数值型参数表达。后一页前一页退出目录1.常数常数〔常量〕表示一个固定的数值。它又分成多种形式:十进制常数十六进制常数二进制常数八进制常数字符串常数符号常数表达式赋值伪操作EQU基数控制伪操作后一页前一页退出目录十进制常数由0~9数字组成,以字母D或d结尾。缺省情况下,后缀D或d可以省略。汇编语言大小写不敏感,D和d通用。例如:100、255D后一页前一页退出目录十六进制常数由0~9、A~F组成,以字母H或h结尾。以字母A~F开头的十六进制数,前面要用0表达,以防止与其他符号混淆。汇编语言大小写不敏感,H和h通用例如:64H、0FFh、0B800H后一页前一页退出目录二进制常数由0或1两个数字组成,以字母B或b结尾。汇编语言大小写不敏感,B和b通用。例如:01101100B后一页前一页退出目录八进制常数由0~7数字组成,以字母Q或q结尾。汇编语言大小写不敏感,Q和q通用。例如:144Q各种进制的数据以后缀字母区分,默认不加后缀字母的是十进制数。后一页前一页退出目录

基数控制伪操作MASM提供基数控制.RADIX伪指令可以改变默认进制,其格式是: .RADIXn其中,n用来表示基数值〔用十进制数表示〕。例如: MOV BX,0FFH .RADIX 16 与 MOV BX,178 MOV BX,0FFH MOV BX,178D是等价的。

.RADIX16把基数定位十六进制后,十进制数后面都应跟字母D。如果某个十六进制数的末字符为D,那么应在其后跟字母H,以免与十进制数发生混淆。后一页前一页退出目录字符串常数用单引号或双引号括起来的单个字符或多个字符,其数值是每个字符对应的ASCII码的值。例如: 'd'=64H 'AB'=4142H 'Hello,Everybody!'后一页前一页退出目录符号常数利用一个标识符表达的一个数值。MASM提供等价机制,用于常量定义。符号定义伪指令:等价EQU伪指令等号=伪指令常数假设使用有意义的符号名来表示,可以提高程序的可读性,同时更具有通用性。后一页前一页退出目录表达式赋值伪操作EQU符号定义伪指令:用于常量定义,利用一个标识符表达的一个数值。等价EQU伪指令:Expression_nameEQUExpression符号名EQU数值表达式符号名EQU<字符串>其中符号名不允许重复定义。等号=伪指令符号名=数值表达式符号名允许重复定义。常数假设使用有意义的符号名来表示,可以提高程序的可读性,同时更具有通用性。二者区别后一页前一页退出目录例:CONSTANT EQU 256 ;数赋以符号名DATA EQU HEIGHT+12 ;地址表达式赋以符号名ALPHA EQU 7 BETA EQU ALPHA-2 ADDR EQU VAR+BETA

B EQU [BETA] ;变址引用赋以符号名BP8 EQU DS:[BP+8]

;加段前缀的变址引用赋以符号名P8这是一组赋值伪操作,把7-2=5赋以符号名BETA,VAR+5赋以符号名ADDR。必须注意:在EQU语句的表达式中,如果有变量或标号的表达式,那么在该语句前应该先给出它们的定义。例如:ABEQUDATA_ONE+2那么必须放在DATA_ONE的定义之后才行,否那么汇编程序将出错。EQU伪指令后一页前一页退出目录例:;******************************************EMP EQU7 ;EMP的值为7…EMPEQUEMP+1 ;错误;这种情况不允许;******************************************…EMP=7 ;EMP的值为7…EMP=EMP+1 ;EMP的值为8;这种情况是允许的EQU与=伪指令后一页前一页退出目录2.数值型表达式数值表达式一般是指由运算符连接的各种常数所构成的表达式。汇编程序在汇编过程中计算表达式,最终得到一个数值。程序运行之前,就已经计算出了表达式;所以,程序运行速度没有变慢,但增强程序的可读性。MASM对除伪指令外各种汇编时处理的指令统称为操作符〔Operator〕。后一页前一页退出目录运算符后一页前一页退出目录例4.18例4.19后一页前一页退出目录例4.18 MOV DX,BLOCK+〔6-1〕*2该指令实现:把首地址为BLOCK的字数组的第6个字传送到DX存放器。后一页前一页退出目录例4.19 ARRARY DW 1,2,3,4,5,6,7 ARYEND DW ? … … MOV CX,〔ARYEND-ARRAY〕/2 ;相当于MOVCX,7以上指令实现:将ARRAY数组长度存入CX存放器。其中,ARYEND是为计算数组长度而建立的符号地址。后一页前一页退出目录逻辑运算符实现按位相与、相或、异或、求反的逻辑运算。

oral,03hAND45h ;等价于oral,01h例4.20、4.21后一页前一页退出目录例4.20 IN AL,PORT_VAL OUT PORT_VAL AND0FEH,AL当PORT_VAL为偶数时,输出端口号与输入端口号相同;当PORT_VAL为奇数时,输出端口号比输入端口号小1。例4.21 AND DX,PORT_VALAND0FEH汇编时对表达式进行计算得到一个端口号;程序运行时,将DX的内容与端口号相“与〞,结果保存到DX中。逻辑运算符举例后一页前一页退出目录移位运算符实现对数值的左移、右移的逻辑操作;移入低位或高位的是0。格式为:数值表达式SHL/SHR移位次数假设移位次数大于15,那么结果为0。例如:moval,0101bSHL(2*2) ;等价于moval,01010000b后一页前一页退出目录关系运算符用于比较和测试符号数值。关系运算符的两个操作数必须是数字,或是同一段内的两个存储器地址。MASM用0FFFFH〔补码-1〕表示条件为真。MASM用0000H表示条件为假。例4.22:movbx,((PORTLT5)AND20)OR((PORTGE5)AND30) ;当PORT<5时,汇编结果为movbx,20 ;否那么,汇编结果为movbx,30后一页前一页退出目录上下别离符取数值的高半局部或低半局部。HIGH、LOW字节别离符:从一个字数值或符号常量中得到高、低字节。HIGHWORD、LOWWORD字别离符:从MASM6.0引入的,取一个符号常量〔不能是其他常数〕的高字或低字局部。

后一页前一页退出目录例: movah,HIGH8765h

;等价于movah,87h CONSTEQU0ABCDH ;定义一个符号常量 MOVAH,HIGHCONST ;等价与MOVAH,0ABH dd_valueequ0ffff1234h ;定义一个符号常量movax,LOWWORDdd_value ;等价于movax,1234h上下别离符举例后一页前一页退出目录3.运算符的优先级1 ()<>[]·LENGTHSIZEWIDTHMASK2 PTROFFSETSEGTPYETHIS:3 HIGELOW4 */MODSHLSHR5 +-6 EQNEGTLTGELE7 NOT8 AND9 ORXOR10 SHORT建议采用圆括号“〔〕〞显式表达,它可以极大地提高程序的可阅读性。后一页前一页退出目录4.地址型参数汇编语言程序中,指令参数还有地址型,它的主要形式是标号和名字〔变量名、段名、过程名等〕。硬指令的操作数有存储单元;存储单元就应该用地址型参数〔存储器操作数〕表达。后一页前一页退出目录4.2.2数据定义及存储器分配伪操作该类伪操作又称变量定义伪指令。变量定义〔Define〕伪指令为变量申请固定长度的存储空间,并可同时将相应的存储单元初始化。 变量名伪指令助记符初值表格式:[Variable]MnemonicOperand,…,Operand[;Commnet]后一页前一页退出目录变量名〔variable〕变量名为用户自定义标识符,表示初值表首元素的逻辑地址;用这个符号表示地址,常称为符号地址。变量名可以没有。这种情况,汇编程序将直接为初值表分配空间,无符号地址。设置变量名是为了方便存取它指示的存储单元。后一页前一页退出目录初值表初值表是用逗号分隔的参数。主要由数值常数、表达式或?、DUP组成?——表示初值不确定,即未赋初值;DUP——表示重复初值。DUP的格式为: 重复次数DUP(重复参数)Repeat_countDUP〔operand,…,opreand〕其中repeat_count可以是一个表达式,它的值应该是一个正整数,用来指定括号中的操作数的重复次数。后一页前一页退出目录变量定义伪指令助记符〔Mnemonic〕变量定义伪指令根据申请的主存空间单位分类,说明所定义的数据类型。DB——定义字节伪指令DW——定义字伪指令DD——定义双字伪指令DF——定义3字伪指令DQ——定义4字伪指令DT——定义10字节伪指令这些伪操作可以把其后跟着的数据存入指定的存储单元,形成初始化数据;或者只分配存储空间而并不存入确定的数值,形成未初始化数据。可存储由16位段地址及32位偏移地址组成的远地址指针。可存储地址形成压缩BCD码后一页前一页退出目录1.定义字节单元伪指令DBDB伪指令用于分配一个或多个字节单元,并可以将它们初始化为指定值。初值表中每个数据一定是字节量〔Byte〕,存放一个8位数据:可以是0~255的无符号数或是-128~+127带符号数也可以是字符串常数后一页前一页退出目录2.定义字单元伪指令DWDW伪指令用于分配一个或多个字单元,并可以将它们初始化为指定值。初值表中每个数据一定是字量〔Word〕,一个字单元可用于存放任何16位数据:一个段地址一个偏移地址两个字符0~65535之间的无符号数-32768~+32767之间的带符号数后一页前一页退出目录3.定义双字单元伪指令DDDD伪指令用于分配一个或多个双字单元,并可以将它们初始化为指定值。初值表中每个数据是一个32位的双字量〔DoubleWord〕:可以是有符号或无符号的32位整数也可以用来表达16位段地址〔高位字〕和16位的偏移地址〔低位字〕的远指针vardd DD 0,?,12345678hfarpoint DD 00400078h后一页前一页退出目录4.其他数据单元定义伪指令定义3字伪指令DF——用于为一个或多个6字节变量分配空间及初始化。6字节常用在32位CPU中表示一个48位远指针〔16位段选择器:32位偏移地址〕定义4字伪指令DQ——用于为一个或多个8字节变量分配空间及初始化。8字节变量可以表达一个64位整数定义10字节伪指令DT——用于为一个或多个10字节变量分配空间及初始化。10字节变量可以表达扩展精度浮点数后一页前一页退出目录例4.7DATA_BYTEDB10,4,10HDATA_WORDDW100,100H,-5DATA_DWDD3*20,0FFFDH汇编程序可以在汇编期间在存储器中存入数据,如图4.2所示。操作数是常数、表达式后一页前一页退出目录例4.8MESSAGE DB‘HELLO’ DB‘AB’ DW‘AB’那么存储器存储情况如图4.5所示。操作数是字符串后一页前一页退出目录例4.9操作数?可以保存存储空间,但不存入数据。如:ABCDB0,?,?,?,0DEFDW?,52,?经汇编后的存储情况如图4.4所示。操作数是?后一页前一页退出目录例4.10ARRAY1 DB2DUP(0,1,2,?)ARRAY2 DB100DUP(?)汇编后的存储情况如图4.5所示。重复定义DUP后一页前一页退出目录例4.11DUP操作可以嵌套,例如:ARRAY3db100dup(0,2dup(1,2),0,3)那么汇编后的结果如图4.6所示。DUP嵌套后一页前一页退出目录例4.12PARAMETER_TABLE DW PAR1 DW PAR2 DW PAR3INTERSEG_DATA DD DATA1 DD DATA2那么汇编程序的存储情况如图4.7所示。表达式为符号地址386及其后继机型具有16位段地址及32位偏移地址组成的48位远地址,可用DF伪指令来定义。后一页前一页退出目录例4.13

.386Datasegsegmentparause32‘data’Parse_tabledb2048dup(0)TblptrdfParse_tableDatasegends汇编后的存储情况如图4.8所示。DF伪指令后一页前一页退出目录5.变量定义伪指令使用说明操作数中的变量或标号可以是表达式,汇编后,存储器中应该存入表达式的值。DB、DW、DD、DF、DQ、DT等伪操作在MASM6中可用BYTE、WORD、DWORD、FWORD、QWORD、TBYTE来取代,其含义是等同的。后一页前一页退出目录4.2.3地址计数器与对准伪操作地址计数器$ORG伪操作EVEN伪操作ALIGN伪操作后一页前一页退出目录1.地址计数器$地址计数器〔locationcounter〕用来保存当前正在汇编的指令的偏移地址。当开始汇编或在每一段开始时,把地址计数器初始化为零。汇编过程中,每处理一条指令,地址计数器就增加一个值,此值为该指令所需要的字节数。地址计数器的值可用符号“$〞表示。汇编语言允许用户直接用$来引用地址计数器的值。后一页前一页退出目录例如:指令 JNS$+6的转向地址为JNS指令的首地址加上6。当$用在指令中时,它表示本条指令的第一个字节的地址。这里,$+6必须是另一条指令的首地址。否那么,汇编程序将指示出错信息。当$用在伪操作的参数字段时,那么表示地址计数器的当前值。例4.17 ARRAYDW1,2,$+4,3,4,$+4这里,$表示当前偏移地址。汇编后的存储区如图4.9所示。地址计数器$后一页前一页退出目录图4.9地址计数器$在指令中用到$时,它只代表该指令的首地址,而与$本身所在的字节无关。后一页前一页退出目录2.ORG伪操作定位伪指令控制数据的偏移地址。ORG参数 或 ORGconstantexpressionORG伪指令是将当前偏移地址指针指向参数表达的偏移地址。 ORG100h ;从100h处安排数据或程序 ORG$+10 ;使偏移地址加10,即跳过10个字节空间如常数表达式的值为n,那么ORG伪操作可以使下一个字节的地址成为常数表达式的值n。常数表达式也可以表示从当前已定义过的符号开始的位移量,或表示从当前地址计数器值$开始的位移量。

举例1举例2后一页前一页退出目录例如: VECTORS SEGMENT

ORG 10 ;VECT1的偏移地址为0AH VECT1 DW 47A5H ;VECT2的偏移地址为14H ORG 20 VECT2 DW 0C596H … VECTORS ENDSORG伪操作举例1后一页前一页退出目录例如: ORG$+8可以表示跳过了8个字节的存储区,亦即建立一个8字节的未初始化的数据缓冲区。如程序中需要访问该存储区,那么可用label伪操作来定义该缓冲区的如下变量名:BUFFER LABEL BYTE ORG $+8或BUFFER DB 8DUP〔?〕ORG伪操作举例2后一页前一页退出目录3.EVEN伪操作EVEN ;从偶地址开始EVEN伪指令使下一个变量或指令开始于偶数字节地址。EVEN伪操作可以保证字数组从偶数地址开始。例如:DATA_SEG SEGMENT … EVEN WORD_ARRAY DW 100DUP〔?〕 … DATA_SEG ENDS一个字的地址最好从偶地址开始。后一页前一页退出目录4.ALIGN伪操作ALIGNn ;从n的整数倍地址开始ALIGN伪操作是将当前偏移地址指针指向n〔n是2的乘方〕的整数倍的地址。如果原地址指针已指向n的整数倍地址,那么不做调整;否那么将指针加以1~n-1中的一个数,使地址指针指向下一个n的整数倍地址。ALIGN2与EVEN等价。后一页前一页退出目录举例Datasegment data01db1,2,3 ;data01的偏移地址为0000h even ;等价于align2 data02dw5 ;data02的偏移地址为0004h

align4

data03dd6 ;data03的偏移地址为0008h org$+10h data04db‘abc’ ;data04的偏移地址为001chDataendsalign伪操作举例后一页前一页退出目录4.2.4变量和标号的属性标号和名字一经定义便具有以下两类三种属性:①段值标号和名字对应存储单元的段地址。②偏移值标号和名字对应存储单元的偏移地址。③类型标号、子程序名的类型可以是NEAR〔近〕和FAR〔远〕,分别表示段内或段间。变量名的类型可以是BYTE〔字节〕、WORD〔字〕和DWORD〔双字〕等。地址属性类型属性后一页前一页退出目录变量的类型属性变量的类型属性〔typeattribute〕:用来表示该语句中的每一个数据项的长度〔以字节为单位表示〕。因此,DB/DW/DD/DF/DQ/DT伪操作的类型属性分别为1、2、4、6、8、10。变量表达式的属性和变量是相同的。汇编程序可以用这种隐含的类型属性来确定某些指令是字指令还是字节指令。后一页前一页退出目录例4.14OPER1 DB ?,?OPER2 DW ?,? … MOVOPER1,0 ;字节指令 MOVOPER2,0 ;字指令变量的类型属性后一页前一页退出目录例4.15OPER1 DB 1,2OPER2 DW 1234H,5678H …

MOV AX,OPER1+1

;类型不匹配

MOV AL,OPER2

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

org$+10 array db45,45h .code

movax,segarray movds,ax movbx,offsetarray ;等价于leabx,array

movcl,array+4 ;等效于movcl,array[4]

movax,es:[2000h]地址操作符

加4个字节单元后一页前一页退出目录例4.27

MOV BX,OFFSETOPER_ONE ;与LEABX,OPER_ONE等价例4.28 如果DATA_SEG是从存储器05000H地址开始的一个数据段的段名,OPER1是该段中的一个变量名。

MOV BX,SEGOPER1 ;汇编结果:MOV BX,0500H ;将OPER1所在段的起始偏移地址送入BX。地址操作符后一页前一页退出目录2.类型操作符类型操作符对名字或标号的类型属性进行有关设置。类型名PTR名字/标号THIS类型名SHORT标号TYPE名字/标号SIZEOF变量名LENGTHOF变量名后一页前一页退出目录〔1〕类型名 PTR名字/标号PTR操作符使名字或标号具有指定的类型。类型名可以是BYTE/WORD/DWORD/FWORD/QWORD/TBYTE或者是NEAR/FAR,还可以是由STRUCT、RECORD、UNION以及TYPEDEF定义的类型。

moval,byteptrw_var ;w_var是一个字变量 jmpfarptrn_label ;n_label是一个标号使用PTR操作符,可以临时改变名字或标号的类型。后一页前一页退出目录例4.29

TWO_BYTE DW ? … ONE_TYPE EQU BYTEPTRTWO_BYTE;ONE_TYPE与TWO_TYPE具有相同的段、偏移地址;但ONE_TYPE为BYTE类型,类型属性为1;TWO_TYPE为WORD类型,类型属性为2 OTHER_TYPE EQU BYTEPTR(TWO_BYTE+1);也可写成:;OTHER_TYPE EQU ONE_BYTE+1例:MOV BYTE PTR[BX],5 MOV WORDPTR[BX],5PTR操作符举例后一页前一页退出目录〔2〕THIS类型名利用THIS说明的操作数具有汇编时的当前逻辑地址,但具有指定的类型。

LABEL伪指令的功能等同于“EQUTHIS〞。后一页前一页退出目录例: b_varequTHISbyte ;按字节访问变量b_var,但与w_var的地址相同 w_vardw10dup(0) ;按字访问变量w_var f_jumpequTHISfar ;用f_jump为段间转移〔f_jumplabelfar〕 n_jump:movax,w_var ;用n_jump为段内近转移,但两者指向同一条指令THIS操作符举例后一页前一页退出目录例:FIRST_TYPE EQU THISBYTEWORD_TABLE DW 100DUP(?);FIRST_TYPE与WORD_TABLE地址相同,但前者为字节类型,后者为字类型。START EQU THISFAR MOV CX,100;MOV指令具有了一个FAR属性的地址START,这就允许其他段的JMP指令直接跳转到START来。THIS操作符举例后一页前一页退出目录〔3〕SHORT标号用来修饰JMP指令中转向地址的属性。指定标号作为-128~+127字节范围内的短转移。 jmpshortn_jump当然,如果标号实际上超出了这个范围,那么出错。对高版本MASM已无意义后一页前一页退出目录〔4〕TYPE名字/标号返回说明名字或标号类型的一个字量数值:对变量,那么返回该变量的以字节数表示的类型。DB/DW/DD/DF/DQ/DT伪操作的类型属性分别为1、2、4、6、8、10。对短、近和远转移依次返回ff01h、ff02h和ff05h。对常数,返回0。 后一页前一页退出目录例: movax,TYPEw_var ;汇编结果为movax,2 movax,TYPEn_jump ;汇编结果为movax,0ff02h〔near标号〕例4.23 ARRAY DW 1,2,3 … ADD SI,TYPEARRAY ;汇编结果为ADD SI,2TYPE操作符举例后一页前一页退出目录〔5〕LENGTH/LENGTHOF变量LENGTH对于变量中使用DUP的情况,将返回分配给该变量的单元数,对于其他情况那么送1。SIZE返回LENGTH与TYPE的乘积。LENGTHOF返回整个变量的数据项数〔即元素数〕。操作符SIZEOF返回整个变量占用的字节数。 SIZEOF=LENGTHOF×TYPE

后一页前一页退出目录例4.24

FEES DW 100DUP(0) … MOV CX,LENGTHFEES ;汇编结果:MOVCX,100

MOV DX,LENGTHOF FEES ;汇编结果:MOVDX,100

MOV CX,SIZEFEES

;汇编结果:MOVCX,200

MOVDX,SIZEOFFEES ;汇编结果:MOVDX,200LENGTH/SIZE后一页前一页退出目录例4.25

ARRAY DW 1,2,3 … MOV CX,LENGTHARRAY ;汇编结果:MOVCX,1

MOV DX,LENGTHOF ARRAY ;汇编结果:MOVDX,3

MOV CX,SIZEARRAY

;汇编结果:MOVCX,2

MOVDX,SIZEOFARRAY ;汇编结果:MOVDX,6LENGTH/SIZE后一页前一页退出目录例4.26

TABLE DB ‘ABCD’ … MOV CX,LENGTHTABLE ;汇编结果:MOVCX,1

MOV DX,LENGTHOF TABLE ;汇编结果:MOVDX,4

MOV CX,SIZETABLE

;汇编结果:MOVCX,1

MOVDX,SIZEOFTABLE ;汇编结果:MOVDX,4LENGTH/SIZE后一页前一页退出目录4.3程序段的定义的相关伪操作4.3.1 DOS的程序结构4.3.2 处理器选择伪操作4.3.3 段定义伪操作4.3.4 程序开始和结束伪操作后一页前一页退出目录4.3.1DOS的程序结构EXE程序COM程序后一页前一页退出目录1.EXE程序利用程序开发工具,通常将生成EXE结构的可执行程序〔扩展名为.EXE的文件〕。它可以有独立的代码、数据和堆栈段,还可以有多个代码段或多个数据段,程序长度可以超过64KB,执行起始处可以任意指定。当DOS装入或执行一个程序时,DOS确定当时主存最低的可用地址作为该程序的装入起始点。此点以下的区域称为程序段。在程序段内偏移0处,DOS为该程序建立一个程序段前缀控制块PSP〔ProgramSegmentPrefix〕,它占256〔=100h〕个字节;而在偏移100h处才装入程序本身。后一页前一页退出目录Exe程序的内存映像图后一页前一页退出目录2.COM程序COM程序是一种将代码、数据和堆栈段合一的结构紧凑的程序,所有代码、数据都在一个逻辑段内,不超过64KB,因而只能用来编制较小的程序。在程序开发时,需要满足一定要求并采用相应参数才能正确生成COM结构的程序。COM文件存储在磁盘上是主存的完全影象,不包含重新定位的加载信息,与EXE文件相比其加载速度更快,占用的磁盘空间也少。尽管DOS也为COM程序建立程序段前缀PSP,但由于两种文件结构不同,所以加载到主存后各段设置并不完全一样。后一页前一页退出目录COM程序COM文件也是一种可执行文件,由程序本身的二进制代码组成,它没有EXE文件所具有的包括有关文件信息的标题区〔header〕,所以它占有的存储空间比EXE文件要小。由于其小而简单,装入速度比EXE文件要快。COM文件不分段,其入口点必须是100H〔其前的256个字节为程序段前缀所在地〕,且不必设置堆栈段。在程序装入时,由系统自动把SP建立在该段之末。对于所有的过程那么应定义为NEAR。下面给出COM文件的源程序格式。后一页前一页退出目录com程序的内存映像图后一页前一页退出目录;PROGRAMTITLEGOESHERE-;Followedbydescriptivephrases;EQUstatementsgohere;****************************************************Prognam segment org 100h assumecs:prognam,ds:prognam,es:prognam,ss:prognam;Main proc near;PROGRAMGOESHERE movax,4c00h ;returntoDOS int21h;(orint20h)COM文件的源程序举例1后一页前一页退出目录;;DATAgoesherePronam ends;*************************************************** end mainCOM文件的源程序举例1后一页前一页退出目录;PROGRAMTITLEGOESHERE- .modeltiny .code org100hStart: jmpbeginMain proc near;DATAGOESHEREbegin:;PROGRAMGOESHERE movax,4c00h int21h end startCOM文件的源程序举例2后一页前一页退出目录COM文件的生成用户在建立源程序后,同样经过汇编、连接形成EXE文件,然后可以通过EXE2BIN程序来建立COM文件,操作方法如下: C>exe2binfilenamefilename第一个filename给出已形成的EXE文件的文件名,但不必给出扩展名。第二个filename即为所要求的COM文件的文件名,必须带有扩展名,这样就形成了COM文件。在DOS系统下,可直接在机器上用文件名执行。如果第二个filename后没有带扩展名,那么生成BIN文件。在DOS系统运行时,必须先用rename命令将它改名为COM文件才能直接运行。COM文件还可以直接在调试程序DEBUG中用A或E命令建立,对于一些短小的程序,这也是一种相当方便的方法。后一页前一页退出目录4.3.2处理器选择伪操作由于80x86的所有处理器都支持8086/8088指令系统,但每一种高档机型又都增加了一些新的指令,因此在编写程序时都要对所用处理器有一个确定的选择。本组伪操作的就是告诉汇编程序应该选择哪一种指令系统。本组伪操作的位置:一般放在整个程序的最前面,如不给出处理器选择,那么默认为.8086。也可放在程序中,如程序中用了一条80486所增加的指令,那么可在该指令的上一行加上.486。后一页前一页退出目录处理器选择伪操作主要有以下几种:.8086 选择8086指令系统.286 选择80286指令系统.286P 选择保护方式下的80286指令系统.386 选择80386指令系统.386P 选择保护方式下的80386指令系统.486 选择80486指令系统.486P 选择保护方式下的80486指令系统 .586 选择Pentium指令系统.586P 选择保护方式下的Pentium指令系统 指包括特权指令在内的指令系统后一页前一页退出目录4.3.3段定义伪操作完整的段定义伪操作存储模型与简化段定义伪操作段组定义伪操作段顺序伪操作为确定标号和变量〔代码段和数据段的符号地址〕的偏移地址;把有关信息通过目标模块传送给连接程序,以便连接程序把不同的段和模块连接在一起,形成一个可执行程序。后一页前一页退出目录1.完整的段定义伪操作段名 segment [定位][组合][段字][‘类别’] ... ;语句序列段名 ends完整段定义由SEGMENT和ENDS这一对伪指令实现,SEGMENT伪指令定义一个逻辑段的开始,ENDS伪指令表示一个段的结束。段定义指令后的4个关键字用于确定段的各种属性,堆栈段要采用stack组合类型,代码段应具有‘code’类别,其他为可选属性参数。如果不指定,那么采用默认参数;但如果指定,注意要按照上列次序。数据段、附加段、和堆栈段中,一般是存储单元的定义、分配等伪操作;代码段那么是指令及伪操作。后一页前一页退出目录〔1〕定位类型〔align_type〕指定逻辑段在主存储器中的边界,可为:PARA 段的起始地址必须从小段边界开始〔xxxx0000b〕。这样,偏移地址可以从0开始。BYTE 该段可以从任何地址开始〔xxxxxxxxb〕,这样起始偏移地址可能不是0。WORD 该段必须从字的边界开始〔xxxxxxx0b〕,即段起始地址必须为偶数。DWORD该段必须从双字的边界开始〔xxxxxx00b〕。PAGE 该段必须从页的边界开始〔00000000b〕,该地址能被256整除。后一页前一页退出目录默认定位类型简化段定义伪指令的代码和数据段默认采用WORD定位,堆栈段默认采用PARA定位。完整段定义伪指令的默认定位属性是PARA,其低4位已经是0,所以默认情况下数据段的偏移地址从0开始。后一页前一页退出目录〔2〕组合类型〔combine_type〕指定多个逻辑段之间的关系,可为:PRIVATE 该段为私有段,在连接时将不与其他模块中同名分段合并。这是完整段定义伪指令默认的段组合方式。PUBLIC 该段连接时,可以把不同模块中的同名段相邻地连接在一起,其连接次序由连接命令指定。每一分段都从小段的边界开始,因此个模块的原有段之间可能存在小于16字节的间隙。这是简化段定义伪指令默认的段组合。MEMORY 与PUBLIC同义。后一页前一页退出目录组合类型〔combine_type〕STACK 把不同模块中的同名段组合而形成一个堆栈段。该段的长度为各原有段的总和,各原有段之间并无PUBLIC所连接段中的间隙,而且栈顶可自动指向连接后形成的大段堆栈段的栈顶。这是堆栈段必须具有的段组合。COMMON 该段连接时,可以把不同模块中的同名段重叠而形成一个段,由于各同名段有相同的起始地址,所以会产生覆盖。COMMON的连接长度是各分段中的最大长度。重叠局部的内容取决于排列在最后一段的内容。ATexpression 使段地址是表达式所计算出来的16位值。但它不能用来指定代码段。后一页前一页退出目录〔3〕使用类型〔use_type〕为支持32位段而设置的属性,只适用于386及其后继机型。它用来说明使用16位寻址方式还是32位寻址方式。它们可以是:USE16 使用16位寻址方式。USE32 使用32位寻址方式。当使用16位寻址方式时,段长<=64KB,地址的形式是16位段地址和16偏移地址;当使用32位寻址方式时,段长可大4GB,地址的形式是16位段地址和32位偏移地址。编写运行于实模式〔8086工作方式〕的汇编语言程序,必须采用USE16。使用类型的默认项是USE16。后一页前一页退出目录〔4〕类别〔‘class’〕在引号中给出连接时组成段组的类型名,段组的类型名可以是任意名称。类型说明并不能把相同类别的段合并起来,但在连接程序组织段时,可将所有的同类别段相邻分配。大多数MASM程序使用‘code’、‘data’和‘stack’来分别指名代码段、数据段和堆栈段,以保持所有代码和数据的连续。后一页前一页退出目录指定段存放器伪指令ASSUMEASSUME段存放器:段名[,段存放器名:段名,...]通知MASM用指定的段存放器来寻址对应的逻辑段,即明确段和段存放器的关系。ASSUME说明分配情况。汇编程序会根据数据所在的逻辑段,在需要时自动插入段超越前缀。这是ASSUME伪指令的主要功能。其中段存放器必须是CS、DS、ES、SS〔386及其后继机型还有FS和GS〕之一,段名那么必须是由SEGMENT定义的段中的段名。后一页前一页退出目录ASSUME伪指令ASSUME伪指令并不为段存放器设定初值,连接程序LINK将正确设置CS:IP和SS:SP。由于数据段通常都需要,所以在样板源程序中,首先为DS赋值;如果使用附加段,还要赋值ES。ASSUMENOTHING那么可取消前面由ASSUME所指定的段存放器。完整段定义举例说明例4.1。后一页前一页退出目录例4.1;*************************************************

data_seg1segment ;定义数据段 …… data_seg1ends;*************************************************

data_seg2segment ;定义附加段

…… data_seg2ends;*************************************************完整段定义后一页前一页退出目录 code_segsegment ;定义代码段 assumecs:code_seg,ds:data_seg1,es:data_seg2 start: ;程序开始执行的位置 ;DS存放器中指定当前数据段地址 movax,data_seg1 ;数据段首地址存入DS movds,ax ;ES存放器中指定当前附加段地址 movax,data_seg2 ;附加段首地址存入ES moves,ax …… code_segends ;代码段结束;************************************************** endstart完整段定义ASSUME并不能把段地址装入段存放器中,所以代码段中要有这样的操作。如果有堆栈段,也需把段地址装入SS中。代码段不需要,代码段的这一操作是在程序初始化时完成的。后一页前一页退出目录2.存储模型与简化段定义伪操作MODEL伪操作简化的段定义伪操作与简化段定义有关的预定义符号用MODEL定义存储模型时的段默认属性简化段定义举例后一页前一页退出目录〔1〕MODEL伪操作

.MODEL存储模式 [,模式选项]使用简化段定义,必须有存储模式伪指令。.model语句必须位于所有段定义语句之前。用来说明在存储器中是如何安放各个段的。存储模式决定一个程序的规模,确定进行子程序调用、指令转移和数据访问的缺省属性。MASM有7种不同的存储模式:①TINY ②SMALL③MEDIUM ④COMPACT⑤LARGE ⑥HUGE⑦FLAT后一页前一页退出目录①Tiny微型模式是MASM6.0才引入的用于创立COM类型程序,COM程序必须从0100H的存储单元开始。这种模型一般用于小程序。用微型模式编写汇编语言程序时,所有的段地址存放器都被设置为同一值。这意味着代码段、数据段、堆栈段都在同一个段内,不大于64KB;访问操作数或指令都只需要使用16位偏移地址。后一页前一页退出目录②Small一般的程序〔例如本书的绝大多数程序例如和习题〕都可用这种模式。在小型模式下,一个程序至多只能有一个代码段和一个数据段,每段不大于64KB。这里的数据段是指数据段、堆栈段和附加段的总和,它们共用同一个段基址,总长度不可超过64KB;因此小模式下程序的最大长度为128KB。访问操作数或指令都只需要使用16位偏移地址;这意味着诸如指令转移、程序调用以及数据访问等都是近属性〔NEAR〕,即小型模式下的调用类型和数据指针缺省分别为近调用和近指针。后一页前一页退出目录③Medium中型模式是与紧凑模式互补的模式。适合于数据量小但代码量大的程序。中型模式的代码段可以超过64KB,有多个;但数据段只能有一个不大于64KB的段。这种模式下数据是近访问;但代码那么是远访问,即调用类型缺省是远〔FAR〕调用,因为要利用段地址区别多个代码段。后一页前一页退出目录④Compact适合于数据量大但代码量小的程序。紧凑模式下,代码段被限制在一个不大于64KB的段内;而数据段那么可以有多个,超过64KB。这种模式下的代码是近访问,即调用类型缺省仍为近调用;而数据那么缺省为远〔FAR〕访问,因为必须用段地址来区别多个数据段。后一页前一页退出目录⑤Large较大型程序通常采用的存储模式。大型模式允许的代码段和数据段都有多个,都可以超过64KB;但全部的静态数据〔不能改变的数据〕仍限制在64K字节内。大型模式下的数据和代码都可以远访问。后一页前一页退出目录⑥HugeHUGE〔巨型模式〕与大型模式根本相同,只是静态数据不再被限制在64K字节之内。后一页前一页退出目录⑦Flat平展模式用于创立一个32位的程序,它只能运行在32位x86CPU上。DOS下不能使用FLAT模式,而编写32位Windows9.x或Windows-NT的程序时,必须采用FLAT模式。MASM5版本不支持这种模型,当MASM6可以支持。DOS下编程可选择前六种模式,一般可以选用SMALL模式。TINY模式产生COM程序,其他模式产生EXE程序,FLAT模式只能用于32位程序。后一页前一页退出目录ModeloptionsModeloptions允许用户指定三种选项:高级语言接口操作系统

温馨提示

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

评论

0/150

提交评论