汇编语言程序设计50452

上传人:桔**** 文档编号:589790361 上传时间:2024-09-11 格式:PPT 页数:90 大小:440KB
返回 下载 相关 举报
汇编语言程序设计50452_第1页
第1页 / 共90页
汇编语言程序设计50452_第2页
第2页 / 共90页
汇编语言程序设计50452_第3页
第3页 / 共90页
汇编语言程序设计50452_第4页
第4页 / 共90页
汇编语言程序设计50452_第5页
第5页 / 共90页
点击查看更多>>
资源描述

《汇编语言程序设计50452》由会员分享,可在线阅读,更多相关《汇编语言程序设计50452(90页珍藏版)》请在金锄头文库上搜索。

1、教学内容教学内容教学内容教学内容 本章以本章以Microsoft公司的宏汇编程序公司的宏汇编程序MASM为背景,为背景,介绍面向介绍面向80x86的汇编语言程序设计方法。包括汇编语的汇编语言程序设计方法。包括汇编语言源程序的格式、伪指令、宏指令以及顺序结构、分支言源程序的格式、伪指令、宏指令以及顺序结构、分支结构、循环结构、结构、循环结构、过程调用等汇编语言程序设计方法。具体内容如下:过程调用等汇编语言程序设计方法。具体内容如下:1、汇编语言源程序的格式及汇编语言上机过程、汇编语言源程序的格式及汇编语言上机过程2、伪指令、伪指令3、宏指令、宏指令4、汇编语言程序设计的基本方法(包括顺序程序、分

2、、汇编语言程序设计的基本方法(包括顺序程序、分支程序、支程序、循环程序、子程序)循环程序、子程序)学习要求学习要求 汇编语言程序设计是汇编语言程序设计是“微型计算机原理微型计算机原理”课程课程非非常重要的内容之一。通过本章学习,应该达到如下常重要的内容之一。通过本章学习,应该达到如下要求:要求:1、熟练掌握汇编语言格式及调试方法。、熟练掌握汇编语言格式及调试方法。2、掌握子程序和宏指令的概念、定义及其调用方法。、掌握子程序和宏指令的概念、定义及其调用方法。3、掌握、掌握DOS调用和调用和BIOS调用的方法。调用的方法。4、熟练掌握顺序程序、分支程序、循环程序设计的、熟练掌握顺序程序、分支程序、

3、循环程序设计的基本方法基本方法和一般技巧。和一般技巧。第第3 3章章 汇编语言程序设计汇编语言程序设计 3.1汇编语言的基本概念汇编语言的基本概念3.2汇编语言源程序的格式汇编语言源程序的格式3.3伪指令语句伪指令语句3.4宏指令语句宏指令语句3.5汇编语言程序的上机过程汇编语言程序的上机过程3.6汇编语言程序设计的基本方法汇编语言程序设计的基本方法在学习了计算机和微处理器的组在学习了计算机和微处理器的组成以及指令系统后,就具备用汇编语言成以及指令系统后,就具备用汇编语言进行程序设计的能力了。汇编语言是一进行程序设计的能力了。汇编语言是一种面向机器的程序设计语言,其基本特种面向机器的程序设计语

4、言,其基本特征是用一组字母、数字和符号来代替二征是用一组字母、数字和符号来代替二进制编码的机器指令和数据。进制编码的机器指令和数据。3.1汇编语言的基本概念汇编语言的基本概念3.1汇编语言的基本概念汇编语言的基本概念程程序序设设计计语语言言是是专专门门为为计计算算机机编编程程所所配配置置的的语语言言。它它们们按按照照形形式式与与功功能能的的不不同同可可分分为为三三种种,即即机机器器语语言、汇编语言和高级语言。言、汇编语言和高级语言。1.机器语言机器语言机机器器语语言言(MachineLanguage)是是由由0和和1二二进进制制代代码码书书写写和和存存储储的的指指令令与与数数据据。它它的的特特

5、点点是是能能被被机机器器直直接接识识别别与与执执行行;程程序序所所占占内内存存空空间间较较少少。其其缺缺点是难认、难记、难编、易错。点是难认、难记、难编、易错。2.汇编语言汇编语言汇编语言(汇编语言(AssemblyLanguage)使用指令的使用指令的助记助记符符、符号地址符号地址、标号标号等书写程序的语言,简称符号语等书写程序的语言,简称符号语言。它的特点是易读、易写、易记。其缺点是不能为言。它的特点是易读、易写、易记。其缺点是不能为机器所直接识别。机器所直接识别。3.高级语言高级语言高级语言(高级语言(HighLevelLanguage)是脱离具体机是脱离具体机器(即独立于机器)的通用语

6、言,器(即独立于机器)的通用语言,不依赖于特定计算不依赖于特定计算机的结构与指令系统。机的结构与指令系统。为什么要用汇编语言编写程序为什么要用汇编语言编写程序 汇编语言是机器语言的符号表示语言,因此,程汇编语言是机器语言的符号表示语言,因此,程序设计人员可以充分利用机器硬件的全部功能,发挥机序设计人员可以充分利用机器硬件的全部功能,发挥机器的长处。器的长处。 现在的微机系统中,底层的一些功能仍然靠汇编现在的微机系统中,底层的一些功能仍然靠汇编语言程序来实现。例如机器的自检、系统初始化、实际语言程序来实现。例如机器的自检、系统初始化、实际的输入输出操作,至今仍然是用汇编语言编制的程序来的输入输出

7、操作,至今仍然是用汇编语言编制的程序来完成。完成。 汇编语言程序的效率通常高于高级语言程序。所汇编语言程序的效率通常高于高级语言程序。所以在节省内存空间和提高程序运行速度的重要场合,如以在节省内存空间和提高程序运行速度的重要场合,如实时控制,常常使用汇编语言来编制的。实时控制,常常使用汇编语言来编制的。鉴于以上理由,现在许多高级语言都设置有与汇编语言鉴于以上理由,现在许多高级语言都设置有与汇编语言程序接口的功能,以便于提高高级语言程序的效率。程序接口的功能,以便于提高高级语言程序的效率。3.2汇编语言源程序的格式汇编语言源程序的格式 例例3.1要求将两个要求将两个5字节十六进制数相加,可以编写

8、出以下字节十六进制数相加,可以编写出以下汇编语言源程序。汇编语言源程序。DATASEGMENT DATA1DB0F8H,60H,0ACH,74H,3BH DATA2DB0C1H,36H,9EH,0D5H,20HDATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOV AX,DATAMOV DS,AXMOV CX,5MOV SI,0CLCLOOPER: MOV AL,DATA2SIADCDATA1SI,AL;与被加数相加;与被加数相加INCSI DECCXJNZLOOPERMOV AH,4CHINT21HCODEENDS;endsegmentENDSTA

9、RT;源程序结束;源程序结束3.2.1 分段结构分段结构 由由上上面面的的例例子子可可以以看看出出,汇汇编编语语言言源源程程序序的的结结构构是是分分段段结结构构形形式式,一一个个汇汇编编语语言言源源程程序序由由若若干干段段(SEGMENT)组组成成,每每个个段段以以SEGMENT语语句句开开始始,以以ENDS语语句句结结束束。整整个个源源程程序序的的结结尾尾是是END语句。语句。这这里里所所说说的的汇汇编编语语言言源源程程序序中中的的段段与与前前面面讨讨论论的的CPU管管理理的的存存储储器器的的段段,既既有有联联系系,又又在在概概念念上上有有所所区区别别。我我们们已已经经知知道道,微微处处理理

10、器器对对存存储储器器的的管管理理是是分分段段的的,因因此此,在在汇汇编编语语言言程程序序中中也也要要求求分分段段组组织织指指令令、数数据据和和堆堆栈栈,以以便便将将源源程程序序汇汇编编成成为目标程序后,可以分别装入存储器的相应段中。为目标程序后,可以分别装入存储器的相应段中。 在上面的简单源程序中只有两个逻辑段,一个逻辑段的名字在上面的简单源程序中只有两个逻辑段,一个逻辑段的名字是是DATA,其中存放着与程序有关的数据,称为逻辑数据段;另其中存放着与程序有关的数据,称为逻辑数据段;另一个逻辑段的名字是一个逻辑段的名字是CODE,其中包含着程序的指令,称为逻辑其中包含着程序的指令,称为逻辑代码段

11、。每个段内均有若干行语句代码段。每个段内均有若干行语句(STATEMENT),因此,可以说因此,可以说一个汇编源程序是由一行一行的语句组成的。下面我们来讨论汇一个汇编源程序是由一行一行的语句组成的。下面我们来讨论汇编语言语句的类型和组成。编语言语句的类型和组成。3.2.2汇编语言语句的类型和格式汇编语言语句的类型和格式 1语句的类型语句的类型汇汇编编语语言言源源程程序序中中的的语语句句可可以以分分为为两两种种类类型型:指指令令语句,伪指令语句。语句,伪指令语句。(1)(1) 指指指指令令令令语语语语句句句句:它它它它是是是是能能能能产产产产生生生生目目目目标标标标代代代代码码码码,CPUCPU

12、可可可可以以以以执执执执行行行行的的的的能完成特定功能的语句。能完成特定功能的语句。能完成特定功能的语句。能完成特定功能的语句。 (2)(2)伪伪伪伪指指指指令令令令语语语语句句句句:它它它它是是是是一一一一种种种种不不不不产产产产生生生生目目目目标标标标代代代代码码码码的的的的语语语语句句句句,它它它它仅仅仅仅仅仅仅仅在在在在汇汇汇汇编编编编过过过过程程程程中中中中告告告告诉诉诉诉汇汇汇汇编编编编程程程程序序序序应应应应如如如如何何何何汇汇汇汇编编编编。例例如如,告告诉诉汇汇编编程程序序已已写写出出的的汇汇编编语语言言源源程程序序有有几几个个段段,段段的的名名字字是是什什么么;定定义义变变量

13、量,定定义义过过程程,给给变变量量分分配配存存储储单单元元,给给数数字字或或表表达达式式命命名名等等。显显然然,伪伪指指令令语语句句是是汇汇编编程程序序在汇编时使用的。在汇编时使用的。DATA1是是名字名字2.语句的格式语句的格式指指令令语语句句与与伪伪指指令令语语句句的的格格式式是是类类似似的的。一一般般情情况况下,汇编语言的语句可以由部分构成:下,汇编语言的语句可以由部分构成: 名字名字名字名字助记符助记符助记符助记符 操作数操作数操作数操作数;注释;注释;注释;注释 其其中中带带方方括括号号的的部部分分表表示示任任选选项项,既既可可以以有有,也也可可以以没没有。例有。例3.1中有如下语句

14、中有如下语句LOOPER:MOVAL,DATA2SI;取一个字节加数取一个字节加数DATA1DB0F8H,60H,0ACH,74H,3BH;被加数;被加数指令语句指令语句伪指令语句伪指令语句“LOOPER:”是名字是名字名字名字 汇编语言语句的第一个组成部分是名字汇编语言语句的第一个组成部分是名字(Name)。)。在指令语句中,这个名字是一个标在指令语句中,这个名字是一个标号。指令语句中的标号实质上是指令的符号地号。指令语句中的标号实质上是指令的符号地址。并非每条指令语句必须有标号,但如果一址。并非每条指令语句必须有标号,但如果一条指令前面有一标号,则程序中其它地方就可条指令前面有一标号,则程

15、序中其它地方就可以引用这个标号。在例以引用这个标号。在例3.1中,中,START、LOOPER就是标号。标号后面有一个冒号。就是标号。标号后面有一个冒号。命名规则命名规则字母字母AZ,az数字数字09专用字符?、专用字符?、.、-,$除数字外,所有字符都可以放在源语句的除数字外,所有字符都可以放在源语句的第一个位置。如果用到第一个位置。如果用到.,则必须是第一个,则必须是第一个字符。可以用很多字符来说明名字,但只字符。可以用很多字符来说明名字,但只有前有前31个字符能被汇编程序识别。个字符能被汇编程序识别。标号有三种属性:段、偏移量和类型。标号有三种属性:段、偏移量和类型。标号的段属性是定义标

16、号在程序段的段地址,当程序标号的段属性是定义标号在程序段的段地址,当程序中引用一个标号时,该标号的段值应在中引用一个标号时,该标号的段值应在CS寄存器中。寄存器中。标号的偏移量属性表示标号所在段的起始地址到定义标号的偏移量属性表示标号所在段的起始地址到定义该标号的地址之间的字节数。偏移量是一个该标号的地址之间的字节数。偏移量是一个16位无符号位无符号数。数。标号的类型属性有两种:标号的类型属性有两种:NEAR和和FAR。前一种标号可。前一种标号可以在段内被引用;后一种标号可以在其它段被引用。如以在段内被引用;后一种标号可以在其它段被引用。如果定义一个标号时后跟冒号,则汇编程序确认其类型为果定义

17、一个标号时后跟冒号,则汇编程序确认其类型为NEAR。 伪伪指指令令语语句句中中的的名名字字可可以以是是变变量量名名、段段名名、过过程程名名。与与指指令令语语句句中中的的标标号号不不同同,这这些些伪伪指指令令语语句句中中的的名名字字并并不不总总是是任任选选的的,有有些些伪伪指指令令规规定定前前面面必必须须有有名名字字,有有些些则则不不允允许许有有名名字字,也也有有一一些些伪伪指指令令的的名名字字是是任任选选的的。即即不不同同的的伪伪指指令令对对于于是是否否有有名名字字有有不不同同的的规规定定。伪伪指指令令语语句句的的名名字字后后面面通通常常不不跟跟冒冒号号,这这是是它它和和标标号号的一个明显区别

18、。的一个明显区别。很很多多情情况况下下伪伪指指令令语语句句中中的的名名字字是是变变量量名名,变变量量名名代代表表存存储储器器中中一一个个数数据据区区的的名名字字,例例如如例例3.1中中的的DATA1、DATA2就就是是变变量名。量名。变量也有三种属性:段、偏移量和类型。变量也有三种属性:段、偏移量和类型。变变量量的的段段属属性性是是变变量量所所代代表表的的数数据据区区所所在在段段的的段段地地址址。由由于于数数据据区区一一般般在在存存储储器器的的数数据据段段中中,因因此此变变量量的的段段地地址址常常常常在在DS和和ES寄存器中。寄存器中。变变量量的的偏偏移移量量属属性性是是该该变变量量所所在在段

19、段的的起起始始地地址址与与变变量量的的地地址之间的字节数。址之间的字节数。 变变量量的的类类型型属属性性有有BYTE(字字节节)、WORD(字字)、DWORD(双双字字)、QWORD(四四字字)、TBYTE(十十字字)等等,表示数据区中存取操作对象的大小。表示数据区中存取操作对象的大小。2)助记符助记符汇编语言语句中的第二个组成部分是助记符(汇编语言语句中的第二个组成部分是助记符(Memonic)。)。在在指指令令语语句句中中的的第第二二部部分分是是CPU指指令令系系统统中中指指令令的的助助记记符符,例例如如:MOV、ADC等等等等。助助记记符符约约有有90多多种种,在在第第二二章章中中已已经

20、进行了详细的讨论。经进行了详细的讨论。在在伪伪指指令令语语句句中中的的第第二二部部分分是是伪伪指指令令的的定定义义符符,例例如如:DB、SEGMENT、ENDS、END等等都都是是伪伪指指令令定定义义符符。它它们们在在程程序序中中的的作作用用是是定定义义变变量量的的类类型型、定定义义段段以以及及告告诉诉汇汇编编程程序序结结束束汇汇编等。编等。3)操作数操作数汇汇编编语语言言语语句句中中的的第第三三个个组组成成部部分分是是操操作作数数。在在指指令令语语句句中中是是指指令令的的操操作作数数,可可能能有有单单操操作作数数或或双双操操作作数数,也也可可能能无无操操作作数数;而而在在伪伪指指令令中中可可

21、能能有有更更多多个个操操作作数数。当当操操作作数数不不止止一一个个时时,相相互互之之间间应应该该用用逗逗号号隔开。隔开。可可以以作作为为操操作作数数的的有有:常常数数、寄寄存存器器、标标号号、变变量量和和表达式等。表达式等。 (1)常数。常数就是指令中出现的那些固定值,可以分为数常数。常数就是指令中出现的那些固定值,可以分为数值常数和字符串常数两类。例如,立即数寻址时所有的立即数、值常数和字符串常数两类。例如,立即数寻址时所有的立即数、直接寻址时所有的地址、直接寻址时所有的地址、ASCII字符串等都是常数。常数是除了字符串等都是常数。常数是除了自身的值以外,没有其他属性的数值。在源程序中,数值

22、常数按自身的值以外,没有其他属性的数值。在源程序中,数值常数按其基数的不同,可有二进制数、八进制数、十进制数、十六进制其基数的不同,可有二进制数、八进制数、十进制数、十六进制数等几种不同表示形式。汇编语言用不同的后缀加以区别。数等几种不同表示形式。汇编语言用不同的后缀加以区别。 常数示例常数示例二进制数:二进制数:10101001B八进制数八进制数:174Q或或174O十进制数十进制数99D或或99十六进制十六进制64H,0F800HASCII字符字符A、8、HELLO十进制科学表示法:十进制科学表示法:8.75E-4十六进制实数:十六进制实数:10A4FE87R (2)寄存器寄存器80868

23、088CPU的寄存器可以作为指令的操作数。的寄存器可以作为指令的操作数。(3)标号标号由由于于标标号号代代表表一一条条指指令令的的符符号号地地址址,因因此此可可以以作作为为转转移移(无无条条件件转转移移或或条条件件转转移移)、过过程程调调用用CALL以以及及循循环环控控制制LOOP指指令的操作数。令的操作数。(4)变量变量因因为为变变量量是是存存储储器器中中某某个个数数据据区区的的名名字字,因因此此在在指指令令中中可可以以作为存储器操作数。作为存储器操作数。(5)表达式表达式汇汇编编语语言言语语句句中中的的表表达达式式,按按其其性性质质可可分分为为两两种种:数数值值表表达达式式和和地地址址表表

24、达达式式。数数值值表表达达式式产产生生一一个个数数值值结结果果,只只有有大大小小,没没有有属属性性。地地址址表表达达式式的的结结果果不不是是一一个个单单纯纯的的数数值值,而而是是一一个个表表示示存存储储器器地地址址的的变变量量或或标标号号,它它有有三三种种属属性性:段段、偏偏移移量量和和类型类型。表达式是由操作数和运算符组成。即用一个运表达式是由操作数和运算符组成。即用一个运算符可以对一个或几个操作数进行运算,构成一个表算符可以对一个或几个操作数进行运算,构成一个表达式。达式。表达式中常用的运算符有以下几种:表达式中常用的运算符有以下几种: 算术运算符:、和算术运算符:、和MOD。 逻辑运算符

25、:逻辑运算符:AND、OR、NOT和和XOR。 关系运算符:关系运算符:EQ、NE、LT、GT、LE、GE。结果只有两个全结果只有两个全1或全或全0。 分析运算符:利用分析运算符可以把一个存分析运算符:利用分析运算符可以把一个存储单元地址分解为段地址和偏移地址等。分析运算符储单元地址分解为段地址和偏移地址等。分析运算符有有SEG 、OFFSET 、TYPE、SIZE和和LENGTH等。等。 分析运算符表达式注意:SIZELENGTHTYPE取去出变量的长度取去出变量的长度LENGTH LENGTH 变量名变量名取出变量的大小取出变量的大小SIZE SIZE 变量名变量名取出变量或标号的类型取出

26、变量或标号的类型TYPE TYPE 变量名或标号变量名或标号取出变量或标号所在段的段地址取出变量或标号所在段的段地址SEG SEG 变量名或标号变量名或标号取出变量名或标号所在段的偏移地址取出变量名或标号所在段的偏移地址OFFSET OFFSET 变量名或标号变量名或标号表达式的意义表达式的意义表达式的意义表达式的意义带分析运算符的表达式带分析运算符的表达式带分析运算符的表达式带分析运算符的表达式合成运算符:可以用来建立或临时改变变量或标号的合成运算符:可以用来建立或临时改变变量或标号的类型或存储器操作数的存储单元类型。合成运算符有类型或存储器操作数的存储单元类型。合成运算符有PTR、THIS

27、等。等。AREAWEQU THISWORDAREABDB100DUP(?)(6)其他运算符其他运算符方括号方括号表示存储器地址,如表示存储器地址,如MOVCL,BX段超越运算符段超越运算符“:”指定一个段属性,如指定一个段属性,如MOVAX,ES:DI两个变量拥有相两个变量拥有相同的存储区域,同的存储区域,但类型不同但类型不同HIGH和和LOW运算符运算符分别用来取得一个数值或地址表达式的高位分别用来取得一个数值或地址表达式的高位和地位字节。和地位字节。STUFFEQU0ABCDHMOVAH,HIGHSTUFFMOVAL,LOWSTUFF结果:结果:AH=0ABHAL=0CDH表达式示例表达式

28、示例ANDAL,01011010BMOVAL,01011010BAND11110000BMOVAX,4EQ3MOVAX,4NE3MOVSI,OFFSETDATA1MOVAX,SEGARRAYINCBYTEPTRBXSIMOVWORDPTRSTUFF3.3 伪指令语句处理器方式伪操作处理器方式伪操作数据定义伪操作数据定义伪操作符号定义伪操作符号定义伪操作段定义伪操作段定义伪操作过程定义伪操作过程定义伪操作模块定义与连接伪操作模块定义与连接伪操作宏处理伪操作宏处理伪操作条件伪操作条件伪操作列表伪操作列表伪操作其他伪操作其他伪操作 处理器方式伪指令处理器方式伪指令.8086。汇编程序将在。汇编程序将

29、在8086方式下操作。方式下操作。.386。汇编程序将在。汇编程序将在80386方式下操作。方式下操作。.386P支持保护方式指令。支持保护方式指令。.387可以接受可以接受8087,80287,80387指令。指令。2.数据定义伪指令数据定义伪指令数据定义伪指令的一般格式为:数据定义伪指令的一般格式为:变量名变量名伪操作符伪操作符操作数操作数,操作数操作数DB定义变量的类型为定义变量的类型为BYTE,给变量分配字节或,给变量分配字节或字节串操作数。字节串操作数。DW定义变量的类型为定义变量的类型为WORD,给变量分配字,给变量分配字操作数。操作数。DD定义变量的类型为定义变量的类型为DWOR

30、D,给变量分配双,给变量分配双字操作数。字操作数。DQ定义四字变量。(定义四字变量。(8字节)字节)DT定义十字节变量。定义十字节变量。数据定义示例数据定义示例DATADB100,0FFH;EXPRDB2*3+7STRDBWELCOM!ABDBABBADWABOFFABDWABADRSDWTABLE,TABLE+5,TABLE+10TOTAL DDTABLENUMDQ0011223344556677HDECML DT1234567890HHEXTB DB01,02,03,04,05,06,07,08,09DB0AH,0BH,0CH,0DH,0EH,0FH?操作数操作数除了常数、表达式和字符串外

31、,问号除了常数、表达式和字符串外,问号“?”也可以作为数据定义伪指令的操作数,此也可以作为数据定义伪指令的操作数,此时仅给变量保留相应的存储单元,而不赋与时仅给变量保留相应的存储单元,而不赋与变量某个确定的初值。变量某个确定的初值。当同样的操作数重复多次时,可用当同样的操作数重复多次时,可用重复操作重复操作符符“DUP”表示,其形式为:表示,其形式为:nDUP(初值,初值初值,初值0)示例示例FILLERDB?SUMDW ?DB?BUFFERDB10DUP(?)ZERODB30DUP(0)MASKDB5DUP(OK!)ARRAYDB100DUP(3DUP(8),6)(6)RECORD伪操作伪操

32、作是由多个字段组成的是由多个字段组成的8位或位或16位的数据类型位的数据类型记录名记录名RECORD字段字段,字段,字段字段格式:字段格式:字段名字段名:宽度宽度=表达式表达式COLORRECORDblink:1,back:3,intense:1,fore:3CWRECORDrl:3=0,ic:1=0,rc:2=0,pc:2=3,r2:2=1,masks:6=63(7)STRUC结构定义伪操作结构定义伪操作定义结构类型定义结构类型结构名结构名 STRUC (数据定义语句组数据定义语句组)结构名结构名ENDSSTUFFSTRUCBUFFERDB100DUP(?)CRLFDB0DH,0AHQUER

33、YDBFilenameENDMARK DB24HSTUFFENDS建立结构变量建立结构变量变量名变量名结构名结构名 引用结构变量引用结构变量结构变量名结构变量名.字段名字段名定义结构类型定义结构类型PERSONSTRUCIDDW ?NAMEDB;20个字符个字符SEXDBFYEARDB1982MONTH DB?DAYDB?PERSON ENDS建立结构变量建立结构变量P1PERSONP2PERSONP3PERSON引用结构变量引用结构变量MOVP1.MONTH,3MOVP2.YEAR+3,5MOVBX,OFFSETP3MOVBX.DAY,313. 符号定义伪指令符号定义伪指令EQU(赋值伪指令

34、)(赋值伪指令)名字名字EQU表达式表达式将一个表达式的值赋予一个名字。将一个表达式的值赋予一个名字。CREQU0DH;常数;常数LFEQU0AHAEQUASCII_TABLE;变量;变量STREQU64*1024;数值表达式;数值表达式ADDREQUES:BP+DI+5;地址表达式地址表达式CBDEQUAAM;指令指令EQU(赋值伪指令)示例(赋值伪指令)示例COLUMN EQU 80ROWEQU 25SCREENFULEQUCOLUMN*ROWBUFFERDWSCREENFULMOVCX,COLUMNMOVBX,ROW (等号伪指令)(等号伪指令)名字表达式名字表达式COUNT=10MOV

35、CX,COUNT;(;(CX)10COUNT=COUNT-1MOVBX,COUNT;(;(BX)9EQU和和“=”伪操作基本相同,伪操作基本相同,“=”可以对同可以对同一个名字重复定义而一个名字重复定义而EQU不允许重复定义。不允许重复定义。符号定义示例符号定义示例AREAWLABELWORDAREABDB100DUP(?)AGAINFLABELFARAGAIN:PUSHAXLABLE(类型定义伪指令)(类型定义伪指令)名字名字LABLE类型类型变量类型:变量类型:BYTE,WORD,DWORD结构或记录类型结构或记录类型标号类型:标号类型:NEAR,FAR作用:同一数据区具有作用:同一数据区

36、具有BYTE和和WORD属性属性同时定义近标号和远标号同时定义近标号和远标号AREAW LABELWORDAREABDB100DUP(?)MOVAREAW,AXMOVAREAB49,ALAGAINF LABELWORDAGAIN:PUSHAX4.段定义伪指令段定义伪指令段定义伪指令的用途是在汇编语言源程序段定义伪指令的用途是在汇编语言源程序中定义逻辑段,常用的段定义伪指令有中定义逻辑段,常用的段定义伪指令有SEGMENTENDS和和ASSUME等等段名段名SEGMENT定位类型定位类型组合类型组合类型类名类名段名段名ENDS定定位位类类型型。定定位位类类型型给给出出实实际际段段起起点点的的类类

37、型型。它它有有PAGE(页页类类型型)、PARA(节节类类型型)、WORD(字字类类型型)、BYTE(字字节节类类型型)四四种种类型:类型:组合类型。组合类型在多模块程序设计中表组合类型。组合类型在多模块程序设计中表示该段和其它同名段间的组合连接方法。组合示该段和其它同名段间的组合连接方法。组合类型有类型有PUBLIC、COMMON、AT、MEMORY、STACK等。等。类名。类名是程序员任选的一个字符串,使类名。类名是程序员任选的一个字符串,使用时必须用单引号括起来。其作用是在连接时用时必须用单引号括起来。其作用是在连接时决定各逻辑段的装入顺序。决定各逻辑段的装入顺序。ASSUME伪指令伪指

38、令它是用来说明逻辑段和物理段关系的伪指令,它是用来说明逻辑段和物理段关系的伪指令,即告诉汇编程序在指令执行期间内存的哪一段即告诉汇编程序在指令执行期间内存的哪一段是数据段,哪一段是堆栈段,哪一段是代码段。是数据段,哪一段是堆栈段,哪一段是代码段。ASSUME段寄存器名:段名,段寄存器名:段名,段寄存器名:段名,段寄存器名:段名,ASSUMECS:CODE,DS:DATA1,ES:DATA2,SS:STACKASSUMEDS:SEGAREA1ASSUMEES:NOTHING;取消前面对取消前面对ES的设置的设置ORG伪指令伪指令伪指令伪指令ORG指出其后的程序段或数据块的起指出其后的程序段或数据

39、块的起始地址的偏移量。其格式为:始地址的偏移量。其格式为:ORG表达式表达式ORG100H;空出;空出256字节空间字节空间DBSTART5.过程定义伪指令过程定义伪指令过程名过程名PROCNEAR/FARRET过程名过程名ENDPCALL过程名过程名3.3 .7宏指令语句宏指令语句1.宏指令、宏定义和宏调用宏指令、宏定义和宏调用宏指令是源程序中具有独立功能的一段程序代码。宏指令是源程序中具有独立功能的一段程序代码。在汇编语言中,如果在源程序中需要多次使用同一个在汇编语言中,如果在源程序中需要多次使用同一个程序段,可以将这个程序段定义(宏定义)为一个宏程序段,可以将这个程序段定义(宏定义)为一

40、个宏指令,然后每次需要是,即可简单地用宏指令名来代指令,然后每次需要是,即可简单地用宏指令名来代替(称为宏调用),从而避免了重复书写,使源程序替(称为宏调用),从而避免了重复书写,使源程序更加简洁、易读。更加简洁、易读。宏定义由宏定义由MASM宏汇编程序提供的伪指令实现,宏汇编程序提供的伪指令实现,其格式为其格式为 宏指令名宏指令名 MACRO 形式参数形式参数 ENDM宏调用的格式为宏调用的格式为 宏指令名宏指令名 实际参数实际参数这就是说,只要在源程序中写上已定义过的宏指这就是说,只要在源程序中写上已定义过的宏指令名就算是调用该宏指令了。令名就算是调用该宏指令了。具有宏调用的源程序被汇编时

41、,每个宏调用将被具有宏调用的源程序被汇编时,每个宏调用将被MASM进行宏展开。宏展开实际上是用宏定义式设计的进行宏展开。宏展开实际上是用宏定义式设计的宏体去代替相应的宏指令,并用实际参数一一取代形参。宏体去代替相应的宏指令,并用实际参数一一取代形参。宏体由此可见,使用宏的过程共有三步:首先进行宏定由此可见,使用宏的过程共有三步:首先进行宏定义;然后可以进行宏调用;最后,汇编时由义;然后可以进行宏调用;最后,汇编时由MASM进行进行宏展开。宏展开。例例若源程序中多处需要将若源程序中多处需要将BL和和CL寄存器中的两寄存器中的两位压缩型的位压缩型的BCD数相加,并将和送回数相加,并将和送回BL寄存

42、器,则可寄存器,则可象下述这样定义宏指令,然后在需要的地方进行调用。象下述这样定义宏指令,然后在需要的地方进行调用。DECADDMACROMOVAL,BLADDAL,CLDAAMOVBL,ALENDM显而易见,这是一个无形式参数的宏定义。显而易见,这是一个无形式参数的宏定义。如果对分别存放在任意如果对分别存放在任意8位寄存器或存储单位寄存器或存储单元中的两个压缩型的元中的两个压缩型的BCD数进行加法运算,则数进行加法运算,则可将上例宏定义改写为可将上例宏定义改写为DECADD1MACROOPR1,OPR2MOVAL,OPR1ADDAL,OPR2DAAMOVOPR1,ALENDM这是一个带有两个

43、形式参数的宏定义。宏这是一个带有两个形式参数的宏定义。宏指令为指令为DECADD1。例如有以下宏调用:例如有以下宏调用:DECADD1DL,BUFFERDECADD1AREA1,AREA2则汇编时进行宏展开,得到以下指令:则汇编时进行宏展开,得到以下指令:DECADD1DL,BUFFER+MOVAL,DL+ADDAL,BUFFER+DAA+MOVDL,ALDECADD1AREA1,AREA2+MOVAL,AREA1+ADDAL,AREA2+DAA+MOVAREA1,AL宏扩展后,原来宏体中的指令前面都加上了符号宏扩展后,原来宏体中的指令前面都加上了符号“”,以示区别。以示区别。声明宏体内局部标

44、号的伪指令(声明宏体内局部标号的伪指令(LOCAL)LOCAL的作用是声明宏体中的局部标号。的作用是声明宏体中的局部标号。LOCAL伪指令必伪指令必须位于宏体内其它所有语句(包括注释)之前,其格式为:须位于宏体内其它所有语句(包括注释)之前,其格式为:LOCAL局部标号局部标号,例如下面的宏指令完成将寄存器中的一位十六进制数转换为例如下面的宏指令完成将寄存器中的一位十六进制数转换为相应的相应的ASCII码,由于宏体中出现局部标号,因此必须使码,由于宏体中出现局部标号,因此必须使用用LOCAL伪指令对宏体中的局部标号进行声明。伪指令对宏体中的局部标号进行声明。HEXTOASC MACROREGL

45、OCALNUMCMP REG,0AHJCNUMADDREG,07HNUM:ADDREG,30HENDM宏指令与子程序的区别宏指令与子程序的区别在汇编语言程序设计中,宏指令和子程序都给设计在汇编语言程序设计中,宏指令和子程序都给设计者提供了很大方便。他们都是可被程序多次调用的程序者提供了很大方便。他们都是可被程序多次调用的程序段,并且调用前必须由设计者袭击根据需要按一定格式段,并且调用前必须由设计者袭击根据需要按一定格式进行定义。然而,宏指令和子程序由于定义方法和几个进行定义。然而,宏指令和子程序由于定义方法和几个是不同,使用中患有许多不同之处,主要是空间和时间是不同,使用中患有许多不同之处,主

46、要是空间和时间的差异。的差异。子程序由子程序由CALL指令调用,由指令调用,由RET指令返回,指令返回,所以汇编后子程序的机器码只占有一个程序段,不管调所以汇编后子程序的机器码只占有一个程序段,不管调用多少次均如此,较为节约内存。宏指令在每次宏调用用多少次均如此,较为节约内存。宏指令在每次宏调用处宏展开时,宏体都要占一个程序段,调用次数愈多,处宏展开时,宏体都要占一个程序段,调用次数愈多,占用内存愈多。因此从内存空间开销来说,子程序优于占用内存愈多。因此从内存空间开销来说,子程序优于宏指令。宏指令。 从程序的执行时间来分析,每调用一次子程序从程序的执行时间来分析,每调用一次子程序都要保护和恢复

47、返回地址(断点)及寄存器内容(现场)都要保护和恢复返回地址(断点)及寄存器内容(现场)等,要消耗较多的时间。宏指令调用时不需要这个过程,等,要消耗较多的时间。宏指令调用时不需要这个过程,执行时间较短。因此,从执行时间来分析,宏指令又优执行时间较短。因此,从执行时间来分析,宏指令又优于子程序。于子程序。综上所述,当某一需多次访问的程序段较长,访综上所述,当某一需多次访问的程序段较长,访问次数又不是太多时,选用子程序结构较好。当某一需问次数又不是太多时,选用子程序结构较好。当某一需多次访问的程序段较短,访问次数又很频繁时,选用宏多次访问的程序段较短,访问次数又很频繁时,选用宏指令结构显然要更好些。

48、指令结构显然要更好些。3.4 常用系统功能调用和BIOS功能调用DOS及及BIOS功能调用属于软件中断,即可用功能调用属于软件中断,即可用INTn指令调用的中断,它可分为三部分:指令调用的中断,它可分为三部分:DOS中断,占用中断类型号为中断,占用中断类型号为20H27H和和2FH,其余类型号保留。其余类型号保留。ROMBIOS中断,占用中断类型号中断,占用中断类型号10H1FH。自由中断,占用中断类型号自由中断,占用中断类型号40HFFH,可供可供系统或应用程序设置开发的中断处理程序用。系统或应用程序设置开发的中断处理程序用。1、DOS中断及功能调用中断及功能调用DOS常用的常用的9类中断(

49、类中断(20H27H和和2FH)可分为可分为两种:两种: DOS专用中断。专用中断。DOS专用中断是指专用中断是指INT 22H、 INT 23H、 INT 24H 3个中断,属个中断,属DOS操作时专用,用操作时专用,用户不要直接使用。户不要直接使用。 DOS可调用中断。可调用中断。DOS可调用中断是指可调用中断是指INT 20H、 INT 21H、 INT 25H、 INT 26H、 INT 27H和和INT 2FH 6个中断。这个中断。这6个中断都供用户直接调用,但都个中断都供用户直接调用,但都必须要满足一定的入口条件。其中:必须要满足一定的入口条件。其中:磁盘读写中断。磁盘读写中断。I

50、NT25H、INT26H分别用来读分别用来读和写磁盘上的若干扇区,这实际上是两条和写磁盘上的若干扇区,这实际上是两条BIOS调用。调用。程序退出中断。程序退出中断。INT20H、INT27H都为程序的都为程序的退出命令。退出命令。假脱机打印文件中断。假脱机打印文件中断。INT2FH用来实现假脱机用来实现假脱机打印文件命令打印文件命令PRINT。系统功能调用。又称为系统功能调用。又称为DOS功能调用,是指功能调用,是指INT21H中断。它是可供系统程序和应用程序调用的一个极中断。它是可供系统程序和应用程序调用的一个极其重要的中断,内含近百个子功能。其重要的中断,内含近百个子功能。2、系统功能调用

51、、系统功能调用1.系统功能调用方法系统功能调用方法DOS启动成功后,启动成功后,INT21H的中断向量的中断向量(中断处理程序的首地址)被初始化在中断向(中断处理程序的首地址)被初始化在中断向量表中,向量地址为量表中,向量地址为84H87H的的4个存储单元内。个存储单元内。调用调用INT21H的方法如下:的方法如下:入口参数送相应的寄存器;入口参数送相应的寄存器;子功能编号送子功能编号送AH;发出中断请求:发出中断请求:INT21H(1)键盘输入)键盘输入字符键:字母、数字、标点符号字符键:字母、数字、标点符号功能键:功能键:Backspace,home、F1F10等等组合键:组合键:Shif

52、t、Alt、Ctrl、Ins等等扫描码:一个字节,低扫描码:一个字节,低7位是编码,最高位位是编码,最高位为键的状态。为键的状态。键按下键按下bit7=0,称为通码。,称为通码。键抬起键抬起bit7=1,称为断码。,称为断码。检查键盘状态检查键盘状态DOS功能调用功能调用0BH,如果有键按下,如果有键按下,AL=0FFH,无,无键按下则键按下则AL=0。LOOP:MOVAH,0BHINT 21H;检查键盘状态;检查键盘状态INC ALJNE LOOP;无键键入一直等待;无键键入一直等待RET;有键键入则返回;有键键入则返回单字符输入单字符输入1,7,8号子功能是从标准输入设备输入一个字符,号子

53、功能是从标准输入设备输入一个字符,并送入寄存器并送入寄存器AL,没有入口参数。例如:,没有入口参数。例如:MOVAH,01HINT21H执行上述指令,系统将扫描键盘,等待有键按下,执行上述指令,系统将扫描键盘,等待有键按下,一旦有键按下,就将键值(相应字符的一旦有键按下,就将键值(相应字符的ASCII码码值)读入,并送入值)读入,并送入AL寄存器,功能寄存器,功能1同时将这个同时将这个字符显示在屏幕上,字符显示在屏幕上,7、8功能无显示。功能无显示。MAIN:KEY:MOVAH,1INT 21HCMPAL,YJEYESCMPAL,NJENOTJMPKEYYES:NOT:字符串输入字符串输入0A

54、H号调用(字符串输入)号调用(字符串输入)从键盘接收字符串到内存输入缓冲区,从键盘接收字符串到内存输入缓冲区,要求要求事先定义一个输入缓冲区事先定义一个输入缓冲区,缓冲区第一个,缓冲区第一个字节指出缓冲区的字符个数,不能为零。字节指出缓冲区的字符个数,不能为零。第二个字节输入的字符实际个数。从第三第二个字节输入的字符实际个数。从第三个字节开始存放从键盘上接收的字符。调个字节开始存放从键盘上接收的字符。调用时,要求用时,要求DS:DX指向输入缓冲区的首地指向输入缓冲区的首地址。键入字符串以回车结束。址。键入字符串以回车结束。DATASEGMENBUFSIZEDB25ACTNUMDB?CHARTE

55、XTDB25DUP(?)DB$DATAENDSCODESEGMENTMOVDX,OFFSETBUFSIZEMOVAH,0AHINT21HCODEENDS(2)字符输出显示字符输出显示02H号调用(字符输出显示)号调用(字符输出显示)2号功能是将一个字符(一个号功能是将一个字符(一个ASCII码值)输出到标码值)输出到标准输出设备(即显示器或打印机)。入口参数为准输出设备(即显示器或打印机)。入口参数为DL寄存器,寄存器寄存器,寄存器DL中存放待输出的字符。例中存放待输出的字符。例如:如:MOVDL,AMOVAH,2INT21H即将字符即将字符“A”显示在屏幕上。显示在屏幕上。09H号调用(字符

56、串输出)号调用(字符串输出)9号功能调用是将缓冲区中的一组以号功能调用是将缓冲区中的一组以“”结束的结束的字符串送标准输出设备输出(显示器或打印机)。调用字符串送标准输出设备输出(显示器或打印机)。调用前必须将输出缓冲区的首地址送前必须将输出缓冲区的首地址送DS:DX。例如:例如:DATASEGMENTBUFDBHOWDOYOUDO?$DATAENDSCODESEGMENTMOVDX,OFFSETBUFMOVAH,9INT21HCODEENDSDATASEGMENBUFSIZEDB25ACTNUMDB?CHARTEXTDB25DUP(?)DB$DATAENDSCODESEGMENTMOVDX,

57、OFFSETBUFSIZEMOVAH,0AHINT21HMOVDX,OFFSETCHARTEXTMOVAH,9INT21HCODEENDS(3)打印输出打印输出功能调用功能调用5,输出字符放在,输出字符放在DL中中DATA SEGMENTSTRDB1BH,45HDATA ENDSCODESEGMENTMOV CX,2MOV AH,5LEABX,STRPRINT:MOVDL,BXINT21HINCBXLOOPPRINT3、BIOS中断调用中断调用在在IBMPC机的机的ROM存储器中包含一些基本输入存储器中包含一些基本输入输出子程序。这些基本输入输出子程序简称为输出子程序。这些基本输入输出子程序简

58、称为BIOS。它它们的功能与们的功能与DOS中字符中字符IO功能相似,用户也可通过软功能相似,用户也可通过软件中断方式直接调用。由于件中断方式直接调用。由于BIOS提供的字符提供的字符IO功能直功能直接依赖于硬件,因而调用它们比调用接依赖于硬件,因而调用它们比调用DOS字符字符IO功能功能速度更快。例如:速度更快。例如:键盘输入子程序。调用指令为键盘输入子程序。调用指令为INT16H屏幕显示子程序。调用指令为屏幕显示子程序。调用指令为INT10H打印输出子程序。调用指令为打印输出子程序。调用指令为INT17HBIOS键盘输入键盘输入AH功能功能返回参数返回参数0从键盘读一字符从键盘读一字符AL

59、=字符码字符码AH=扫描码扫描码1读键盘缓冲区字符读键盘缓冲区字符如果如果ZF=0AL=字符码字符码AH=扫描码扫描码ZF=1缓冲区为空缓冲区为空2读取键盘状态字节读取键盘状态字节AL=键盘状态键盘状态键盘状态字节键盘状态字节D7 D6 D5 D4 D3 D2 D1 D0=1按下右按下右SHIFT键键=1按下左按下左SFIFT键键=1按下按下CTRL键键=1按下按下ALT键键Scrolllock键状态键状态Numlock键状态键状态Capslock键状态键状态Insert状键态状键态ON=1,OFF=0ON=1,OFF=0ON=1,OFF=0ON=1,OFF=0BIOS键盘输入示例键盘输入示例

60、MOVAH,0INT16HCMPAL,0JNEERRORCMPAH,3BH;F1键码键码=3BHJETT1CMPAH,3CH;F2键码键码=3CHJETT2JMPERRORTT1:TT2:ERROR3.5 汇编语言程序设计的基本方法汇编语言程序设计的基本方法通常通常, ,编制一个汇编语言源程序应按如下步骤编制一个汇编语言源程序应按如下步骤进行进行: : 明确任务明确任务, ,确定算法。确定算法。 绘制流程图。绘制流程图。 根据流程图编写汇编语言程序。根据流程图编写汇编语言程序。 上机调试程序。上机调试程序。程序的基本结构有四种:顺序结构、分支结程序的基本结构有四种:顺序结构、分支结构、循环结构

61、和子程序结构。构、循环结构和子程序结构。子程序设计子程序设计子程序又称为过程,它相当于高级语言的过程或函子程序又称为过程,它相当于高级语言的过程或函数,是一个独立的程序段,能完成某些确定的功能,并数,是一个独立的程序段,能完成某些确定的功能,并能别其它程序调用。当一个子程序不被调用能别其它程序调用。当一个子程序不被调用,且该子程且该子程序完成确定的功能后序完成确定的功能后,便返回调用程序处。便返回调用程序处。过程的定义采用过程定义伪指令,其格式为:过程的定义采用过程定义伪指令,其格式为:过程名过程名PROC类型类型RET过程名过程名ENDP寄存器内容的保护和恢复寄存器内容的保护和恢复( (保护

62、现场与恢复现场)保护现场与恢复现场)通常主程序和过程的设计是分开的通常主程序和过程的设计是分开的, ,因而他们因而他们所使用的寄存器往往会发生冲突。为避免冲突,所使用的寄存器往往会发生冲突。为避免冲突,应在进入过程时,将该过程所用到的寄存器内应在进入过程时,将该过程所用到的寄存器内容保护起来,称为保护现场。而从过程返回主容保护起来,称为保护现场。而从过程返回主程序前,再将这些寄存器的内容恢复,称为恢程序前,再将这些寄存器的内容恢复,称为恢复现场。保护现场和恢复现场通常分别用堆栈复现场。保护现场和恢复现场通常分别用堆栈压入指令和弹出指令来实现。例如:压入指令和弹出指令来实现。例如:SUBPRPR

63、OCFARPUSHAXPUSHBXPUSHCXPUSHDXPUSHDXPUSHCXPUSHBXPUSHAXRETSUBPRENDP主程序和过程间的参数传递主程序和过程间的参数传递主程序调用过程时,必须先将过程所需要的初始主程序调用过程时,必须先将过程所需要的初始数据设置好,这些初始数据称为过程的入口参数。过数据设置好,这些初始数据称为过程的入口参数。过程执行完毕返回主程序时也必须将过程运行所得的结程执行完毕返回主程序时也必须将过程运行所得的结果送给主程序,这些回送的结果称为过程的出口参数。果送给主程序,这些回送的结果称为过程的出口参数。过程入口参数的送入和出口参数的送出城为主程序和过程入口参数

64、的送入和出口参数的送出城为主程序和过程间的参数传递,也称过程通信。过程通信通常有过程间的参数传递,也称过程通信。过程通信通常有四种方法。四种方法。 通过寄存器传递参数通过寄存器传递参数 通过变量传递参数通过变量传递参数 通过地址表传递参数通过地址表传递参数 通过堆栈传递参数通过堆栈传递参数DATASEGMENTHEXDATADW4D7EHRESULTDB4DUP(?)DATAENDSCODESEGMENTASSUMECS:CODE;DS:DATASTART: MOV AX,DATAMOV DS,AXMOV CX,4LEASI,HEXDATALEADI,RESULTMOV BX,SINEXT:

65、MOV AX,BXANDAL,0FHCALL HEXASCMOV DI,ALINCDIPUSH CXMOV CX,4SHRBX,CLPOPCXLOOP NEXTLEASI,RESULT+3MOV CX,4STDLOOP1:LODSBMOV DL,ALMOV AH,02HINT21HLOOP LOOP1MOV DL,HMOV AH,02HINT21HMOV AH,4CHINT21H;十六进制转换成十六进制转换成ASCII码子程序码子程序HEXASCPROCCMPAL,0AHJBPLUS30ADDAL,07HPLUS30:ADD AL,30HRETHEXASCENDPCODE ENDSENDSTA

66、RTEXE文件的结构文件的结构DOS的的COMMANDCOM文件接受一个键盘命令文件接受一个键盘命令后后(EXE文件和文件和COM文件的名字也是键盘命令文件的名字也是键盘命令),首先判断是内部命令还是外部命令,若是外部,首先判断是内部命令还是外部命令,若是外部命令则去检测可用存储区的最低地址和最高地址,命令则去检测可用存储区的最低地址和最高地址,然后在可用地址的低端开始的然后在可用地址的低端开始的100H个单元建立将个单元建立将要装入的程序的程序前缀区要装入的程序的程序前缀区(PSP),在接下来的地,在接下来的地址装入程序本身,之后转向这个程序的入口地址开址装入程序本身,之后转向这个程序的入口

67、地址开始执行。始执行。对于每一个可执行文件,装入后都有一个程序前对于每一个可执行文件,装入后都有一个程序前缀区缀区PSP(Program Segment Prefix),这个区域,这个区域内包括有这个文件的一些信息。内包括有这个文件的一些信息。 PSP占占100H个字个字节节 程序前缀区程序前缀区PSP(ProgramSegmentPrefix)图图4-23程序前缀区程序前缀区(PSP)PSP的头两个字节为的头两个字节为INT20H指令。指令。EXE文件被装入内文件被装入内存后,存后,DOS将将DS和和ES寄存器指向寄存器指向PSP区的起点,即区的起点,即INT20H指令,这个指令的功能是返回

68、操作系统。但指令,这个指令的功能是返回操作系统。但INT20H的执行需要一个大前提,那就是只有当的执行需要一个大前提,那就是只有当CS指指向向PSP区时,这条指令才能正常运行。区时,这条指令才能正常运行。返回DOS的程序 PUSHDS;将;将PSP区的段基址入栈区的段基址入栈MOVAX;0PUSHAX;将;将PSP区的区的INT20H指令的偏指令的偏移量入栈移量入栈这样,堆栈中首先保存了这样,堆栈中首先保存了PSP区的人口地址。区的人口地址。因程序的最后一条执行指令是因程序的最后一条执行指令是RET,执行,执行时,它将这个入口地址弹入时,它将这个入口地址弹入CS:IP中,此时中,此时便会执行便

69、会执行1NT20H,实现正确返回,实现正确返回DOS。EXE文件头文件头EXEHEADERSTRUCexSignature dw5A4Dh;.EXE标志标志exExraBytes dw?;最后最后(部分部分)页中的字节数页中的字节数exPagesdw?;文件中的全部和部分页数文件中的全部和部分页数exRelocItemsdw?;重定位表中的指针数重定位表中的指针数exHeaderSizedw?;以字节为单位的文件头大小以字节为单位的文件头大小exMinAlloc dw?;最小分配大小最小分配大小exMaxAlloc dw?;最大分配大小最大分配大小exInitSSdw?;初始初始SS值值exI

70、nitSPdw?;初始初始SP值值exChechSumdw?;补码校验值补码校验值exInitIPdw?;初始初始IP值值exInitCSdw?;初始初始CS值值exRelocTabledw?;重定位表的字节偏移量重定位表的字节偏移量exOverlaydw?;覆盖号覆盖号EXEHEADERENDS程序映象,程序映象,定位表是一个重定位指针数组,每个指向程定位表是一个重定位指针数组,每个指向程序映象中的可重定位段地址。文件头中的序映象中的可重定位段地址。文件头中的exRelocItems域说明了数组中指针的个数域说明了数组中指针的个数,exRelocTable域说明了分配表的起始文件偏域说明了分

71、配表的起始文件偏移量。每个重定位指针由两个移量。每个重定位指针由两个16位值组成位值组成:偏偏移量和段值。移量和段值。 为加载为加载.EXE程序,程序,MS-DOS首先读文件头以首先读文件头以确定确定.EXE标志并计算程序映象的大小。然后标志并计算程序映象的大小。然后它试图申请内存。分配完内存后,它试图申请内存。分配完内存后,MS-DOS确定段地址,也称为起始段地址,确定段地址,也称为起始段地址,MS-DOS从此处加载程序映象。从此处加载程序映象。接下来,接下来,MS-DOS读取重定位表中的项目调整所读取重定位表中的项目调整所有由可重定位指针说明的段地址。对于重定位表有由可重定位指针说明的段地

72、址。对于重定位表中的每个指针,中的每个指针,MS-DOS寻找程序映象中相应的寻找程序映象中相应的可重定位段地址,并把起始段地址加到它之上。可重定位段地址,并把起始段地址加到它之上。一旦调整完毕,段地址便指向了内存中被加载程一旦调整完毕,段地址便指向了内存中被加载程序的代码和数据段。序的代码和数据段。MS-DOS在所分配内存的最低部分建造在所分配内存的最低部分建造256字节的字节的PSP,把,把AL和和AH设置为加载设置为加载.COM程序时所设置程序时所设置的值。的值。MS-DOS使用文件头中的值设置使用文件头中的值设置SP与与SS,调整,调整SS初始值,把起始地址加到它之上。初始值,把起始地址加到它之上。MS-DOS还把还把ES和和DS设置为设置为PSP的段地址的段地址.最后,最后,MS-DOS从从程序文件头读取程序文件头读取CS和和IP的初始值的初始值,把起始段地址把起始段地址加到加到CS之之上,把控制转移到位于调整后地址处的上,把控制转移到位于调整后地址处的程序。程序。

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

最新文档


当前位置:首页 > 建筑/环境 > 施工组织

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