汇编语言讲义第四章-汇编语言程序格式3课件.ppt

上传人(卖家):晟晟文业 文档编号:5137896 上传时间:2023-02-14 格式:PPT 页数:72 大小:364.50KB
下载 相关 举报
汇编语言讲义第四章-汇编语言程序格式3课件.ppt_第1页
第1页 / 共72页
汇编语言讲义第四章-汇编语言程序格式3课件.ppt_第2页
第2页 / 共72页
汇编语言讲义第四章-汇编语言程序格式3课件.ppt_第3页
第3页 / 共72页
汇编语言讲义第四章-汇编语言程序格式3课件.ppt_第4页
第4页 / 共72页
汇编语言讲义第四章-汇编语言程序格式3课件.ppt_第5页
第5页 / 共72页
点击查看更多>>
资源描述

1、4.3.1 完整段定义的伪操作完整段定义的伪操作 8086/8088在管理内存时,需要按照逻辑段进行划在管理内存时,需要按照逻辑段进行划分,不同的逻辑段可以用来存放不同目的的数据。在分,不同的逻辑段可以用来存放不同目的的数据。在程序中使用四个段寄存器程序中使用四个段寄存器CS,DS,ES和和SS来访问它们。来访问它们。在源程序设计时,使用伪指令来定义和使用这些逻辑段。在源程序设计时,使用伪指令来定义和使用这些逻辑段。段名段名 SEGMENT 定位类型定位类型 组合类型组合类型 类别名类别名 .本段语句序列本段语句序列 .段名段名 ENDS一般格式:一般格式:一、段定义伪指令一、段定义伪指令 伪

2、指令伪指令SEGMENT和和ENDS用于定义一个逻辑段。使用于定义一个逻辑段。使用时必须配对,分别表示定义的开始与结束。用时必须配对,分别表示定义的开始与结束。段名是由用户自己任意选定的,符合标识符定义段名是由用户自己任意选定的,符合标识符定义规则的一个名称。规则的一个名称。段定义伪指令语句各部分的作用如下:段定义伪指令语句各部分的作用如下:1、段名、段名 最好选用与该逻辑段用途相关的名称。如第一个数最好选用与该逻辑段用途相关的名称。如第一个数据段为据段为DATA1,第二个数据为第二个数据为DATA2等。等。一个段的开始与结尾用的段名必须一致。一个段的开始与结尾用的段名必须一致。2、定位类型、

3、定位类型 定位类型用于决定段的起始边界,即第一个可存放数据定位类型用于决定段的起始边界,即第一个可存放数据的位置(不是段基址)。它可以有的位置(不是段基址)。它可以有4种取值。种取值。由于一个页面为由于一个页面为256个字节,并且页面编号从个字节,并且页面编号从0开始,因此,开始,因此,PAGE定位类型的段起始地址的最后定位类型的段起始地址的最后8位二进制数一定为位二进制数一定为0,即以即以00H结尾的地址。结尾的地址。(1)PAGE:表示该段从一个页面的边界开始表示该段从一个页面的边界开始(2)PARA:表示该段从一个小节的边界开始表示该段从一个小节的边界开始如果用户未选定位类型,则缺省为如

4、果用户未选定位类型,则缺省为PARA。(3)WORD:表示该段从一个偶数字节地址开始,即段起始表示该段从一个偶数字节地址开始,即段起始单元地址的最后一位二进制数一定是单元地址的最后一位二进制数一定是0。(4)BYTE:表示该段起始单元地址可以是任一地址值。表示该段起始单元地址可以是任一地址值。注意注意:定位类型为:定位类型为PAGE和和PARA时,段起始地址与段基址时,段起始地址与段基址相同。定位类型为相同。定位类型为WORD和和BYTE时,段起始地址与段基址时,段起始地址与段基址可能不同。可能不同。(1)NONE:若未指定组合类型,表示本段与其它段无连接若未指定组合类型,表示本段与其它段无连

5、接关系。在装入内存时,本段有自己的物理段,因此有自己的关系。在装入内存时,本段有自己的物理段,因此有自己的段基址。段基址。3、组合类型、组合类型 组合类型说明符用来指定段与段之间的连接关系和定位。组合类型说明符用来指定段与段之间的连接关系和定位。它有六种取值选择。它有六种取值选择。(2)PUBLIC:在满足定位类型的前提下,将不同模块的同在满足定位类型的前提下,将不同模块的同名段邻接在一起,形成一个新的逻辑段,共用一个段基址。名段邻接在一起,形成一个新的逻辑段,共用一个段基址。段内的所有偏移量调整为相对于新逻辑段的段基址。段内的所有偏移量调整为相对于新逻辑段的段基址。(3)COMMON:产生一

6、个覆盖段。在多个模块连接时,把产生一个覆盖段。在多个模块连接时,把该段与其它也用该段与其它也用COMMON说明的同名段置成相同的段基址,说明的同名段置成相同的段基址,这样就达到了共享同一存储区。共享存储区的长度由同名段这样就达到了共享同一存储区。共享存储区的长度由同名段中最大的段确定。中最大的段确定。(4)STACK:把所有同名段连接成一个连续段,且系统自动把所有同名段连接成一个连续段,且系统自动对对SS段寄存器初始化为该连续段的段基址。并初始化堆栈指段寄存器初始化为该连续段的段基址。并初始化堆栈指针针SP。用户程序中应至少有一个段用用户程序中应至少有一个段用STACK说明,否则需要用说明,否

7、则需要用户程序自己初始化户程序自己初始化SS和和SP。(5)AT表达式表达式:表示本段可定位在表达式所指示的小节边:表示本段可定位在表达式所指示的小节边界上。表达式的值也就是段基值。界上。表达式的值也就是段基值。(6)MEMORY:表示本段在存储器中应定位在所有其它段这表示本段在存储器中应定位在所有其它段这之后的最高地址上。如果有多个用之后的最高地址上。如果有多个用MEMORY说明的段,则只说明的段,则只处理第一个用处理第一个用MEMORY说明的段。其余的被视为说明的段。其余的被视为COMMON.类别名为某一个段或几个相同类型段设定的类型名称。类别名为某一个段或几个相同类型段设定的类型名称。系

8、统在进行连接处理时,把类别名相同的段存放在相邻的存系统在进行连接处理时,把类别名相同的段存放在相邻的存储区,但段的划分与使用仍按原来的设定。储区,但段的划分与使用仍按原来的设定。4.类别名类别名 类别名必须用单引号引起来。所用字符串可任意选定,类别名必须用单引号引起来。所用字符串可任意选定,但它不能使用程序中的标号、变量名或其它定义的符号。但它不能使用程序中的标号、变量名或其它定义的符号。在定义一个段时,段名是必须有的项,而定位类型、组在定义一个段时,段名是必须有的项,而定位类型、组合类型和类别名三个参数是可选项。各个参数之间用空格分合类型和类别名三个参数是可选项。各个参数之间用空格分隔。各参

9、数之间的顺序不能改变。隔。各参数之间的顺序不能改变。下面是一个分段结构的源程序框架。下面是一个分段结构的源程序框架。STACK1 SEGMENT PARA STACK STACK0 .STACK1 ENDSDATA1 SEGMENT PARA DATA .DATA1 ENDSSTACK2 SEGMENT PARA STACK0 .STACK2 ENDSCODE SEGMENT PARA MEMORY ASSUME CS:CODE,DS:DATA1,SS:STACK1MAIN:.CODE ENDS END MAINDATA2 SEGMENT BYTE DATA .DATA2 ENDS 上述源程序

10、经上述源程序经LINK程序程序进行连接处理后,程序被装入进行连接处理后,程序被装入内存的情况如右图所示。内存的情况如右图所示。如果在段定义中选用了如果在段定义中选用了PARA定位类型说明,则在一个段的定位类型说明,则在一个段的结尾与另一个段的开始之间可结尾与另一个段的开始之间可能存在一些空白,图中以兰色能存在一些空白,图中以兰色框表示。框表示。CODE段的组合类型段的组合类型为为MEMORY,因此被装入在其因此被装入在其它段之后。它段之后。在进行程序设计时,如果程序不大,一般只需要定在进行程序设计时,如果程序不大,一般只需要定义三个段就可以了。义三个段就可以了。0000HSTACK1STACK

11、2DATA1DATA2CODE间隔间隔 二、段寻址伪指令二、段寻址伪指令 段寻址伪指令段寻址伪指令ASSUME的作用是告诉汇编程序的作用是告诉汇编程序,在处理源在处理源程序时,定义的段与哪个寄存器关联。程序时,定义的段与哪个寄存器关联。ASSUME 段寄存器名:段名,段寄存器名:段名,段寄存器名:段名,段寄存器名:段名,.一般格式一般格式:其中段寄存器名为其中段寄存器名为CS,DS,ES和和SS四个之一,段名是用四个之一,段名是用SEGMENT/ENDS伪指令定义的段名。伪指令定义的段名。ASSUME并不设置各个段寄存器的具体内容,段寄存器并不设置各个段寄存器的具体内容,段寄存器的值是在程序运

12、行时设定的。的值是在程序运行时设定的。DATA1 SEGMENTVAR1 DB 12HDATA1 ENDSDATA2 SEGMENT VAR2 DB 34H DATA2 ENDS CODE SEGMENT VAR3 DB 56H ASSUME CS:CODE,DS:DATA1,ES:DATA2START:.INC VAR1 INC VAR2 INC VAR3 .CODE ENDS END START例如:例如:该指令汇编时,该指令汇编时,VAR1使用的是使用的是DS该指令被汇编时,该指令被汇编时,VAR2使用的使用的是是ES,即指令编码中有段前缀即指令编码中有段前缀在一个代码段中可以有几条在一

13、个代码段中可以有几条ASSUME伪指令,对于前面的伪指令,对于前面的设置,可以用设置,可以用ASSUME改变原来的设置。改变原来的设置。一条一条ASSUME语句不一定设置全部段寄存器,可以选择其中语句不一定设置全部段寄存器,可以选择其中一个或几个段寄存器。一个或几个段寄存器。可以使用关键字可以使用关键字NOTHING将前面的设置删除。将前面的设置删除。ASSUME ES:NOTHING;删除前面对删除前面对ES与某个定义段的关联与某个定义段的关联ASSUME NOTHING ;删除全部删除全部4个段寄存器的设置个段寄存器的设置例如:例如:三、段寄存器的装入三、段寄存器的装入 段寄存器的初值(段

14、基值)装入需要用程序的方法来实段寄存器的初值(段基值)装入需要用程序的方法来实现。四个段寄存器的装入方法略有不同。现。四个段寄存器的装入方法略有不同。在程序中,使用数据传送语句来实现对在程序中,使用数据传送语句来实现对DS和和ES的装入。的装入。1、DS和和ES的装入的装入DATA1 SEGMENTDBYTE1 DB 12HDATA1 ENDSDATA2 SEGMENTDBYTE2 DB 14H DUP(?)DATA2 ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA1START:MOV AX,DATA1 MOV DS,AX MOV AX,DATA2 MOV ES

15、,AX MOV AL,DBYTE1 MOV DBYTE22,AL .CODE ENDS 例如:例如:该指令在汇编时出错,该指令在汇编时出错,因为在因为在ASSUME指令指令中未指定中未指定ES与与DATA2的联系。的联系。为了改正上述程序中的错误,可以在变量为了改正上述程序中的错误,可以在变量DBYTE2前加一个段前缀说明即可。即:前加一个段前缀说明即可。即:MOV ES:DBYTE22,ALSS的装入有两种方法的装入有两种方法2、SS的装入的装入(1)在段定义伪指令的组合类型项中,使用)在段定义伪指令的组合类型项中,使用STACK参参数,并在段寻址伪指令数,并在段寻址伪指令ASSUME语句中

16、把该段与语句中把该段与SS段寄段寄存器关联。存器关联。STACK1 SEGMENT PARA STACK DB 40H DUP(?)STACK1 ENDS .CODE SEGMENT ASSUME CS:CODE,SS:STACK1 .例如:例如:SS将被自动装入将被自动装入STACK1段的段基值,堆栈指针段的段基值,堆栈指针SP也也将指向堆栈底部将指向堆栈底部+2的存储单元。上例中(的存储单元。上例中(SP)=40H。(2)如果在段定义伪指令的组合类型中,未使用)如果在段定义伪指令的组合类型中,未使用STACK参数,或者是在程序中要调换到另一个堆栈,这时,可以参数,或者是在程序中要调换到另一

17、个堆栈,这时,可以使用类似于使用类似于DS和和ES的装入方法。的装入方法。DATA_STACK SEGMENT DB 40H DUP(?)TOP LABEL WORDDATA_STACK ENDS .CODE SEGMENT .MOV AX,DATA_STACK MOV SS,AX MOV SP,OFFSET TOP .例如:例如:TOP变量的偏移量为40H CS保存的是当前目标代码的段基值,而保存的是当前目标代码的段基值,而IP提供下一条将提供下一条将要执行的目标代码的偏移量。要执行的目标代码的偏移量。CPU在执行指令之前根据在执行指令之前根据CS和和IP的内容来从内存中提取指令。因此,必须

18、在程序执行之前的内容来从内存中提取指令。因此,必须在程序执行之前装入装入CS和和IP的值。由于这时程序还没有运行,就无法用几条的值。由于这时程序还没有运行,就无法用几条可执行语句来装入可执行语句来装入CS和和IP。3、CS的装入的装入 END 起始地址起始地址装入装入CS和和IP一般有下面两种情况。一般有下面两种情况。(1)按照结束伪指令指定的地址装入按照结束伪指令指定的地址装入CS和和IP任何一个源程序都必须以任何一个源程序都必须以END伪指令来结束。伪指令来结束。起始地址可以是一个标号或表达式,它与程序中第一条起始地址可以是一个标号或表达式,它与程序中第一条指令语句前所加的标号必须一致。指

19、令语句前所加的标号必须一致。其格式为:其格式为:END伪指令的作用是标识源程序结束和指定程序运行时伪指令的作用是标识源程序结束和指定程序运行时的起始地址。当程序被装入内存时,根据起始地址的段基值的起始地址。当程序被装入内存时,根据起始地址的段基值和偏移量分别自动装入和偏移量分别自动装入CS和和IP中。中。.CODE SEGMENT ASSUME CS:CODE,.START:.CODE ENDS END START例如:例如:(2)在程序运行期间,当执行某些指令时,在程序运行期间,当执行某些指令时,CPU自动修改自动修改CS和和IP,使它们指向新的代码段。,使它们指向新的代码段。执行段间过程调

20、用执行段间过程调用CALL和段间返回指令和段间返回指令RET;执行段间无条件转移指令执行段间无条件转移指令JMP;响应中断及中断返回指令;响应中断及中断返回指令;执行硬件复位操作。执行硬件复位操作。例如:例如:在程序设计过程中,常常将具有一定功能的程序段设计成一在程序设计过程中,常常将具有一定功能的程序段设计成一个子程序。在个子程序。在MASM宏汇编程序中,用过程宏汇编程序中,用过程(PROCEDURE)来构造子程序。来构造子程序。四、过程定义伪指令(四、过程定义伪指令(PROC/ENDP)过程名过程名 PROC NEAR/FAR .RET .过程名过程名 ENDP过程定义伪指令格式如下:过程

21、定义伪指令格式如下:其中,过程名是该子程序的名称,它被用作过程调用指令其中,过程名是该子程序的名称,它被用作过程调用指令CALL的目的操作数。它类同一个标号的作用。具有段、偏的目的操作数。它类同一个标号的作用。具有段、偏移量和距离三个属性。而距离属性使用移量和距离三个属性。而距离属性使用NEAR和和FAR来指定,来指定,若没有指定,则隐含为若没有指定,则隐含为NEAR。NEAR过程只能被本段指令调用,而过程只能被本段指令调用,而FAR过程可以供其它段过程可以供其它段的指令调用。的指令调用。每一个过程中必须包含有返回指令每一个过程中必须包含有返回指令RET,其作用是控制其作用是控制CPU从从子程

22、序中返回到调用该过程的主程序。子程序中返回到调用该过程的主程序。五、当前位置计数器五、当前位置计数器$与定位伪指令与定位伪指令ORG(Origin)汇编程序在汇编源程序时,每遇到一个逻辑段,就要为其汇编程序在汇编源程序时,每遇到一个逻辑段,就要为其设置一个位置计数器,它随时记录着定义的每一个数据或每设置一个位置计数器,它随时记录着定义的每一个数据或每一条指令在程序中的位置。一条指令在程序中的位置。在源程序中,使用符号在源程序中,使用符号$来表示位置计数器的当前值。因来表示位置计数器的当前值。因此,此,$被称为当前计数器。它位于不同的位置具有不同的值。被称为当前计数器。它位于不同的位置具有不同的

23、值。位置计数器位置计数器$在使用上完全类似变量的使用在使用上完全类似变量的使用.作用:将数值表达式的值赋给当前位置计数器。作用:将数值表达式的值赋给当前位置计数器。ORG语句语句为其后的数据或指令设置起始偏移量。为其后的数据或指令设置起始偏移量。表达式的值必须为正值。表达式中也可以包含有当前表达式的值必须为正值。表达式中也可以包含有当前位置计数器的现行值位置计数器的现行值$。定位伪指令定位伪指令ORG用来改变位置计数器的值。用来改变位置计数器的值。ORG 数值表达式数值表达式格式:格式:DATA1 SEGMENT ORG 30H DB1 DB 12H,34H ;DB1在在DATA1段内的偏移量

24、为段内的偏移量为30H ORG$+20H;保留保留20H个字节单元,其后再存放个字节单元,其后再存放ABCD.STRING DB ABCDEFGHI COUT EQU$-STRING ;计算计算STRING的长度的长度 DB2 DW$;取取$的偏移量的偏移量,类似变量的用法类似变量的用法 DB3 DB$;此语句错误此语句错误!DATA1 ENDS CODE SEGMENT ASSUME CS:CODE.ORG 10H START:MOV AX,DATA MOV DS,AX .CODE ENDS END START六、标题伪指令六、标题伪指令TITLETITLE 标题名标题名语句格式:语句格式:

25、作用:给所在程序指定一个标题。以便在列表文件的每一页的作用:给所在程序指定一个标题。以便在列表文件的每一页的第一行都显示这个标题。其中标题是用户任意选用的字符串,第一行都显示这个标题。其中标题是用户任意选用的字符串,字符个数不能超过字符个数不能超过60。由于由于80 x86的所有处理器都支持的所有处理器都支持8086/8088指令系统,但每指令系统,但每一种高档机型又都增加了一些新的指令,因此在编写程一种高档机型又都增加了一些新的指令,因此在编写程序时都要对所用处理器有一个确定的选择。序时都要对所用处理器有一个确定的选择。本组伪操作的就是告诉汇编程序应该选择哪一种指令系本组伪操作的就是告诉汇编

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

27、6指令系统指令系统.386 P选择保护方式下的选择保护方式下的80386指令系统指令系统.486选择选择80486指令系统指令系统.486 P选择保护方式下的选择保护方式下的80486指令系统指令系统.586选择选择Pentium指令系统指令系统.586 P选择保护方式下的选择保护方式下的Pentium指令系统指令系统指包括特权指令在指包括特权指令在内的指令系统内的指令系统(一)使用程序段前缀(一)使用程序段前缀PSP(Program Segment Prefix)实现返回实现返回八、从程序返回操作系统的方法八、从程序返回操作系统的方法 为了使程序运行结束后,能够正确地返回到操作系统,为了使程

28、序运行结束后,能够正确地返回到操作系统,需要在用户程序中加上一些必要的语句。一般有以下两种需要在用户程序中加上一些必要的语句。一般有以下两种方法。方法。DOS系统将一个系统将一个.EXE(可执行文件)装入内存时,在(可执行文件)装入内存时,在该文件的前面生成一个程序段前缀该文件的前面生成一个程序段前缀PSP,其长度为,其长度为100H字节。字节。同时让同时让DS和和ES都指向都指向PSP的开始,而的开始,而CS指向该程序的代码指向该程序的代码段,即第一条可执行指令。段,即第一条可执行指令。为了使程序执行完后,正确返回为了使程序执行完后,正确返回DOS,需要做以下三个工作:,需要做以下三个工作:

29、1.将用户程序编制成一个过程,类型为将用户程序编制成一个过程,类型为FAR;2.将将PSP的起始逻辑地址压栈,即将的起始逻辑地址压栈,即将INT 20H指令的地址压栈指令的地址压栈;如图所示。如图所示。PSP中一开始就中一开始就是一条中断指令是一条中断指令 INT 20H,执行该指令将终止用户程序,执行该指令将终止用户程序,返回返回DOS系统。系统。3.在用户程序结束时在用户程序结束时,使用使用RET指令。执行该指令将使保存指令。执行该指令将使保存在堆栈中的在堆栈中的INT 20H 的逻辑地址弹出到的逻辑地址弹出到CS和和IP中。中。DATA SEGMENTDATA SEGMENT DATA

30、ENDSDATA ENDSSTACK1 SEGMENT STACKSTACK1 SEGMENT STACK STACK1 ENDSSTACK1 ENDSCODE SEGMENTCODE SEGMENTBEGIN PROC FARBEGIN PROC FAR ASSUME CS:CODE,DS:DATA,SS:STACK1 ASSUME CS:CODE,DS:DATA,SS:STACK1START:PUSH DSSTART:PUSH DS MOV AX,0 MOV AX,0 PUSH AX PUSH AX 程序结构如下:程序结构如下:MOV AX,DATA MOV AX,DATA MOV DS,

31、AX MOV DS,AX RET RETBEGIN ENDPBEGIN ENDPCODE ENDSCODE ENDS END START END START (二)使用(二)使用DOS系统功能调用实现返回系统功能调用实现返回 执行执行DOS功能调用功能调用4CH,也可以控制用户程序结束,也可以控制用户程序结束,并返回并返回DOS操作系统。操作系统。MOV AH,4CH INT 21H具体方法是在程序结束时,使用两条指令:具体方法是在程序结束时,使用两条指令:CODE SEGMENTCODE SEGMENT ASSUME CS:CODE.ASSUME CS:CODE.BEGIN:MOV AX,D

32、ATABEGIN:MOV AX,DATA MOV DS,AX MOV DS,AX MOV AH,4CH MOV AH,4CH INT 21H INT 21HCODE ENDSCODE ENDS END BEGIN END BEGIN用户程序的代码段的结构为:用户程序的代码段的结构为:4.3.2 DOS的程序结构的程序结构 EXE程序程序 COM程序程序1.EXE程序程序 利用程序开发工具,通常将生成利用程序开发工具,通常将生成EXE结构的可执行程序结构的可执行程序(扩展名为(扩展名为.EXE的文件)。的文件)。它可以有独立的代码、数据和堆栈段,还可以有多个代码它可以有独立的代码、数据和堆栈段,

33、还可以有多个代码段或多个数据段,程序长度可以超过段或多个数据段,程序长度可以超过64KB,执行起始处,执行起始处可以任意指定。可以任意指定。当当DOS装入或执行一个程序时,装入或执行一个程序时,DOS确定当时主存最低的确定当时主存最低的可用地址作为该程序的装入起始点。此点以下的区域称为可用地址作为该程序的装入起始点。此点以下的区域称为程序段。在程序段内偏移程序段。在程序段内偏移0处,处,DOS为该程序建立一个程为该程序建立一个程序段前缀控制块序段前缀控制块PSP(Program Segment Prefix),它占),它占256(=100h)个字节;而在偏移)个字节;而在偏移100h处才装入程

34、序本身。处才装入程序本身。Exe程序的内存映像图程序的内存映像图2.COM程序程序 COM程序是一种将代码、数据和堆栈段合一的结构紧凑程序是一种将代码、数据和堆栈段合一的结构紧凑的程序,所有代码、数据都在一个逻辑段内,不超过的程序,所有代码、数据都在一个逻辑段内,不超过64KB,因而只能用来编制较小的程序。,因而只能用来编制较小的程序。在程序开发时,需要满足一定要求并采用相应参数才能正在程序开发时,需要满足一定要求并采用相应参数才能正确生成确生成COM结构的程序。结构的程序。COM文件存储在磁盘上是主存的完全影象,不包含重新文件存储在磁盘上是主存的完全影象,不包含重新定位的加载信息,与定位的加

35、载信息,与EXE文件相比其加载速度更快,占用文件相比其加载速度更快,占用的磁盘空间也少。的磁盘空间也少。尽管尽管DOS也为也为COM程序建立程序段前缀程序建立程序段前缀PSP,但由于两,但由于两种文件结构不同,所以加载到主存后各段设置并不完全一种文件结构不同,所以加载到主存后各段设置并不完全一样。样。COM程序程序 COM文件也是一种可执行文件,由程序本身的二进制代文件也是一种可执行文件,由程序本身的二进制代码组成,它没有码组成,它没有EXE文件所具有的包括有关文件信息的标文件所具有的包括有关文件信息的标题区(题区(header),所以它占有的存储空间比),所以它占有的存储空间比EXE文件要小

36、。文件要小。由于其小而简单,装入速度比由于其小而简单,装入速度比EXE文件要快。文件要快。COM文件不分段,其入口点必须是文件不分段,其入口点必须是100H(其前的(其前的256个个字节为程序段前缀所在地),且不必设置堆栈段。字节为程序段前缀所在地),且不必设置堆栈段。在程序装入时,由系统自动把在程序装入时,由系统自动把SP建立在该段之末。建立在该段之末。对于所有的过程则应定义为对于所有的过程则应定义为NEAR。下面给出下面给出COM文件的源程序格式。文件的源程序格式。com程序的内存映像图程序的内存映像图;PROGRAM TITLE GOES HERE-;Followed by descri

37、ptive phrases;EQU statements go here;*Prognamsegmentorg 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 herePrognam ends;*end mainCOM文件的源程序举例文件的源程序举例1;PROGRAM TITLE GOES HERE-.model

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

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

40、或或E命令建立,对于一些短小的程序,这命令建立,对于一些短小的程序,这也是一种相当方便的方法。也是一种相当方便的方法。4.3.3 存储模型与简化段定义伪操作存储模型与简化段定义伪操作 MODEL伪操作伪操作 简化的段定义伪操作简化的段定义伪操作 与简化段定义有关的预定义符号与简化段定义有关的预定义符号 用用MODEL定义存储模型时的段默认属性定义存储模型时的段默认属性 简化段定义举例简化段定义举例(1)MODEL伪操作伪操作.MODEL 存储模式存储模式,模式选项,模式选项 使用简化段定义,必须有存储模式伪指令。使用简化段定义,必须有存储模式伪指令。.model语句必须位于所有段定义语句之前。

41、用来说明在存语句必须位于所有段定义语句之前。用来说明在存储器中是如何安放各个段的。储器中是如何安放各个段的。存储模式决定一个程序的规模,确定进行子程序调用、指存储模式决定一个程序的规模,确定进行子程序调用、指令转移和数据访问的缺省属性。令转移和数据访问的缺省属性。MASM有有7种不同的存储模式:种不同的存储模式:TINY SMALL MEDIUM COMPACT LARGE HUGE FLAT Tiny 微型模式是微型模式是MASM 6.0才引入的才引入的用于创建用于创建COM类型程序类型程序,COM程序必须从程序必须从0100H的存的存储单元开始。储单元开始。这种模型一般用于小程序这种模型一

42、般用于小程序。用微型模式编写汇编语言程序时,所有的段地址寄存器都用微型模式编写汇编语言程序时,所有的段地址寄存器都被设置为同一值。被设置为同一值。这意味着代码段、数据段、堆栈段都在这意味着代码段、数据段、堆栈段都在同一个段同一个段内,不大内,不大于于64KB64KB;访问操作数或指令都只需要使用;访问操作数或指令都只需要使用1616位偏移地址。位偏移地址。Small 一般的程序一般的程序(例如本书的绝大多数程序示例和习题)都可(例如本书的绝大多数程序示例和习题)都可用这种模式。用这种模式。在小型模式下,一个程序至多在小型模式下,一个程序至多只能有一个代码段和一个数只能有一个代码段和一个数据段据

43、段,每段不大于,每段不大于64KB。这里的这里的数据段数据段是指是指数据段、堆栈段和附加段的总和数据段、堆栈段和附加段的总和,它们,它们共用同一个段基址,总长度不可超过共用同一个段基址,总长度不可超过64KB;因此小模式;因此小模式下程序的最大长度为下程序的最大长度为128KB。访问操作数或指令都只需要使用访问操作数或指令都只需要使用16位偏移地址;这意味着位偏移地址;这意味着诸如指令转移、程序调用以及数据访问等都是诸如指令转移、程序调用以及数据访问等都是近属性近属性(NEAR),即小型模式下的调用类型和数据指针缺省分,即小型模式下的调用类型和数据指针缺省分别为近调用和近指针。别为近调用和近指

44、针。Medium 中型模式是与紧凑模式互补的模式。中型模式是与紧凑模式互补的模式。适合于数据量小但代码量大的程序。适合于数据量小但代码量大的程序。中型模式的中型模式的代码段代码段可以超过可以超过64KB,有多个有多个;但;但数据段只数据段只能有一个能有一个不大于不大于64KB的段。的段。这种模式下数据是近访问;但代码则是远访问,即调用类这种模式下数据是近访问;但代码则是远访问,即调用类型缺省是远(型缺省是远(FAR)调用,因为要利用段地址区别多个代)调用,因为要利用段地址区别多个代码段。码段。Compact 适合于数据量大但代码量小的程序适合于数据量大但代码量小的程序。紧凑模式下,紧凑模式下,

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

46、(不能改变的数据)仍限制在64K字节内。字节内。大型模式下的大型模式下的数据和代码都可以远访问。数据和代码都可以远访问。Huge HUGE(巨型模式)与大型模式基本相同,只是静态数据(巨型模式)与大型模式基本相同,只是静态数据不再被限制在不再被限制在64K字节之内。字节之内。Flat 平展模式用于平展模式用于创建一个创建一个32位的程序位的程序,它只能运行在,它只能运行在32位位x86 CPU上。上。DOS下不能下不能使用使用FLAT模式,而编写模式,而编写32位位Windows 9.x或或Windows-NT的程序时,必须采用的程序时,必须采用FLAT模式。模式。MASM5版本不支持这种模型

47、,当版本不支持这种模型,当MASM6可以支持。可以支持。DOS下编程可选择前六种模式,一般可以选用下编程可选择前六种模式,一般可以选用SMALL模式。模式。TINY模式产生模式产生COM程序,其他模式产生程序,其他模式产生EXE程序,程序,FLAT模模式只能用于式只能用于32位程序。位程序。Model options Model options允许用户指定三种选项:允许用户指定三种选项:高级语言接口高级语言接口操作系统操作系统堆栈距离堆栈距离 高级语言接口:该汇编程序作为某一高级语言程序的过程高级语言接口:该汇编程序作为某一高级语言程序的过程而为该高级语言程序调用时,应该用而为该高级语言程序调

48、用时,应该用C,BASIC,FORTRAN,PASCAL等来说明。等来说明。操作系统:说明程序运行于哪个操作系统之下,可用操作系统:说明程序运行于哪个操作系统之下,可用OS_DOS或或OS_OS2来说明,默认项是来说明,默认项是OS_DOS。Model options 堆栈距离:可用堆栈距离:可用NEARSTACK 或或FARSTACK来说明。来说明。NEARSTACK是指把堆栈段和数据段组合到一个是指把堆栈段和数据段组合到一个DGROUP段中,段中,DS和和SS均指向均指向DGROUP段;段;FARSTACK是指堆栈段和数据段并不合并。是指堆栈段和数据段并不合并。当存储模型为当存储模型为TI

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

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

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 办公、行业 > 各类PPT课件(模板)
版权提示 | 免责声明

1,本文(汇编语言讲义第四章-汇编语言程序格式3课件.ppt)为本站会员(晟晟文业)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!


侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|