DOS Windows汇编语言程序设计教程 7-302-11082-4k 第三章3.4

上传人:w****i 文档编号:94404921 上传时间:2019-08-06 格式:PPT 页数:85 大小:151KB
返回 下载 相关 举报
DOS Windows汇编语言程序设计教程 7-302-11082-4k 第三章3.4_第1页
第1页 / 共85页
DOS Windows汇编语言程序设计教程 7-302-11082-4k 第三章3.4_第2页
第2页 / 共85页
DOS Windows汇编语言程序设计教程 7-302-11082-4k 第三章3.4_第3页
第3页 / 共85页
DOS Windows汇编语言程序设计教程 7-302-11082-4k 第三章3.4_第4页
第4页 / 共85页
DOS Windows汇编语言程序设计教程 7-302-11082-4k 第三章3.4_第5页
第5页 / 共85页
点击查看更多>>
资源描述

《DOS Windows汇编语言程序设计教程 7-302-11082-4k 第三章3.4》由会员分享,可在线阅读,更多相关《DOS Windows汇编语言程序设计教程 7-302-11082-4k 第三章3.4(85页珍藏版)》请在金锄头文库上搜索。

1、3.4 子程序与扩展子程序,在程序设计中,常常会遇到某些功能完全相同的程序段在同一程序的多处或不同程序中出现,如求一个数的阶乘,比较两数大小,求字符串的长度,数制转换等等。为了节省存贮空间,减少编制程序的重复劳动,可以将这些多次重复的程序段从整个程序中独立出来,附加一些额外语句,将它编制成一种具有公用性的,独立的程序段子程序,并通过适当的方法把它与其他程序段链接起来,这种程序设计的方法就称为子程序设计。,子程序结构的优点:,可以减小程序的长度,节省了计算机汇编源程序的时间和程序的存储空间。 子程序可以重复使用,使得程序设计时间可以大量节省。 增加了程序的可读性,方便对程序的修改、调试。 子程序

2、是模块化、结构化、自顶向下程序设计的基础,MASM6.x子程序定义的方法,一般过程定义(子程序)伪指令。 子程序在汇编语言中也称为过程(Procedure),它相当于高级语言C+的函数和VB的过程 扩展过程定义(扩展子程序)伪指令。,一般过程定义(子程序)伪指令,过程定义的一般格式为: 过程名 PROC NEAR/FAR . . ;过程定义体 . RET 过程名 ENDP,过程名由程序员来命名,命名方法同变量名,同一源程序中不能有相同的过程名。 PROC为过程定义开始伪指令,ENDP为过程定义结束伪指令,PROC-ENDP必须配对使用;配对的PROC-ENDP前面的过程名应相同。 NEAR/F

3、AR定义了过程的属性,NEAR属性的过程只能被相同代码段的程序调用,称为段内近调用;FAR 属性的过程只能被相同或不同代码段的程序调用,称为段间远调用。,子程序的结构形式,一个完整的子程序一般包括下列内容: (1) 子程序的说明部分 (2) 子程序的调用和返回 (3) 子程序的现场保护和现场恢复,子程序的说明部分,子程序的说明部分一般包括如下内容 : (1)子程序名。命名时要见名知意。 (2)子程序的功能。说明子程序完成的任务。 (3)子程序的入口参数。说明子程序运行所需参数及存放位置。 (4)子程序的出口参数。说明子程序的运行结果的参数及存放位置。 (5)子程序所占用的寄存器和工作单元。 (

4、6)子程序调用示例。,举例,;子程序名:B16TOD ;子程序的功能:完成将一个16位二进制数(无符号数)转换为对应的十进制数的 ;ASCII码,存放在共享存储区SHALLUNIT ;子程序的入口参数:存放在BINNUM存储单元 ;子程序的出口参数:存放在共享存储区SHALLUNIT和共享存储单元ADDRESS ;子程序所占用的寄存器和:AX,DX,SI,BX ;子程序调用示例:,子程序的调用和返回,CALL指令的执行分成两步 : 第一步,保护返回地址(CALL指令下一条指令的地址),利用堆栈实现,即将返回地址压入堆栈; 第二步,转向子程序,即把子程序的首地址送入IP或CS:IP RET指令的

5、功能是返回主程序,即把子程序的返回地址送入IP或CS:IP。,子程序的现场保护和现场恢复,在主程序调用子程序时已经占用了一定数量的寄存器,子程序执行时又要使用寄存器,子程序执行完返回主程序后,又要保证主程序按原来状态继续执行,这就需要对那些在主程序中使用过了的寄存器,在子程序中又要用,且它们在主程序中的值又不能被覆盖时(因为子程序返回后主程序还要使用),这些寄存器的内容在子程序体执行之前必须加以保护,这就称为现场保护,子程序执行完再恢复这些寄存器的内容,称为现场恢复。子程序的现场保护和现场恢复既可以在主程序中完成,也可以在子程序中完成,但为了使程序结构清晰,我们一般在子程序中完成现场保护和现场

6、恢复。,子程序的现场保护和现场恢复方法有两种 利用堆栈实现现场保护和现场恢复(利用PUSH/POP指令实现)。 利用内存单元实现现场保护和现场恢复(利用MOV指令实现)。,利用堆栈实现现场保护和恢复,过程名 PROC NEAR/FAR PUSH AX. . . ;保护现场 . PUSH DX . . ;过程定义体 . POP DX . . ;恢复现场 . POP AX RET 过程名 ENDP,3.4.2 子程序参数传递方法,主程序在调用子程序之前,必须把要子程序处理的数据传送给子程序,这些加工处理的数据就称为子程序的输入参数,也叫入口参数。 当子程序执行完返回主程序时,应该把本次处理的结果返

7、回给主程序,这些加工处理的结果就称为输出参数,也称为子程序的出口参数。,子程序参数传递的方法,利用寄存器实现参数传递。 利用内存单元实现参数传递。 利用堆栈实现参数传递,利用寄存器实现子程序参数传递,这种方法是通过寄存器存放参数来进行传递的,即在主程序调用子程序前,将入口参数送到约定寄存器中;子程序可以直接从这些寄存器中取出参数进行加工处理,并将结果也放在约定的寄存器中,然后返回主程序,主程序再从寄存器中取出结果。,利用存贮单元实现子程序参数传递,这种方法是在主程序调用子程序前,将入口参数存放到约定的存储单元(如变量)中,子程序运行时到约定的位置读取参数;子程序执行结束将结果也放在约定单元。我

8、们还可以通过用寄存器存放存储区首地址,来实现多参数情况下的传递。,利用堆栈实现子程序参数传递,利用堆栈实现参数传递的方法是在调用子程序之前,用PUSH指令将子程序的入口参数压入堆栈,在子程序中通过出栈指令依次得到这些参数。经过子程序操作处理后再将子程序的出口参数压入堆栈,返回主程序后再通过出栈指令获得结果。一般只通过堆栈传入口参数。,利用堆栈实现参数传递是最重要的方法。在使用这种方式传递参数时,特别要注意堆栈的使用情况,一是子程序返回地址的保护与恢复要占用堆栈(因为是计算机自动实现的,特别容易疏忽);二是要保持堆栈的平衡,可以通过使用RET n指令来完成。,3.4.3 扩展过程定义(扩展子程序

9、)伪指令,在前面我们给出的子程序定义格式是一个最基本的、最简单约定义格式。在宏汇编MASM 6.x系统中又提供了带参数的子程序定义方式。,扩展过程定义(扩展子程序)伪指令的一般格式,子程序名 PROC 调用距离 语言类型 作用范围 USES寄存器列表 ,参数:数据类型 LOCAL 定义局部变量 ;子程序定义体 RET 子程序名 ENDP,子程序名:应该是遵循相应语言类型的标识符。 调用距离:子程序的调用距离有:Near、Far、Near16、Farl6、Near32和Far32。 语言类型 : 子程序语言类型可以是任何一种有效的语言类型,由它来告诉汇编程序将使用什么样的标识符命名约定、子程序的

10、调用和返回约定。,作用范围:子程序的作用范围决定该子程序对其他模块是否可用。 起始参数:采用这种格式的PROC伪指令,汇编程序在处理子程序时能自动产生“起始”代码(Prologue code )和“结束”代码(Epilogue code)。,寄存器列表:保护寄存器说明子句的说明格式为:USES 寄存器列表。 参数:类型 子程序参数表示该子程序使用的参数及类型,若有多个参数,则参数之间要用逗号分开。,局部变量的定义,局部变量的定义格式: LOCAL 变量名个数:数据类型,变量名个数:数据类型, 伪指令LOCAL的作用是说明一个或多个临时的局部变量(位于堆栈区)。该伪指令必须在任何指令之前加以说明

11、,并可用多个LOCAL伪指令来说明其局部变量。,子程序声明伪指令,子程序声明伪指令的格式如下: 子程序名 PROTO 调用距离 语言类型 ,参数:数据类型 该伪指令告诉汇编程序该子程序的若干属性,如调用距离、语言类型、参数个数及其类型等。这样,汇编程序就可以对其定义进行适当的检查。,子程序的INVOKE调用伪指令,调用伪指令INCOKEE的一般格式为: INVOKE 子程序名,参数1,参数2, 该伪指令是调用基于堆栈的子程序方法,它把所有参数压栈,子程序结束时,又实现堆栈的平衡。,3.5 中断,在计算机系统中,引入中断的最初目的是为了提高系统的输入输出性能。随着计算机应用的发展,中断技术也应用

12、到计算机系统的许多领域,如:多道程序、分时系统、实时处理、程序监视和跟踪等领域。,所谓中断就是CPU暂停当前程序的执行,转而执行处理紧急事务的程序,并在该事务处理完后能自动恢复执行原先程序的过程。在此,称引起紧急事务的事件为中断源,称处理紧急事务的程序为中断服务程序或中断处理程序。 计算机系统还根据紧急事务的紧急程度,把中断分为不同的优先级,并规定:高优先级的中断能暂停低优先级的中断服务程序的执行。,中断和中断源,计算机系统有上百种可以发出中断请求的中断源,但最常见的中断源是:外设的输入输出请求,如:键盘输入引起的中断,通信端口接受信息引起的中断等;还有一些计算机内部的异常事件,如:0作除数、

13、奇偶校验错等。,CPU在执行程序时,是否响应中断要取决于以下三个条件能否同时满足: (1) 有中断请求; (2) 允许CPU接受中断请求; (3) 一条指令执行完,下一条指令还没有开始执行。,条件(1)是响应中断的主体。除用指令INT所引起的软件中断之外,其它中断请求信号是随机产生的,程序员是无法预见的。 程序员可用程序部分地控制条件(2)是否满足,即可用指令STI和CLI来允许或不允许CPU响应可屏蔽的外部中断。而对于不可屏蔽中断和内部中断,CPU一定会响应它们的,程序员是无控制权的。CPU一定会执行这些中断的中断服务程序。,中断向量表是一个特殊的线性表,它保存着系统所有中断服务程序的入口地

14、址(偏移量和段地址)。在微机系统中,该向量表有256个元素(00FFH),每个元素占4个字节,总共1K字节,其在内存中的存储形式及其存储内容,中断向量表和中断服务程序,中断向量表设置在主存的最低1KB区域内,向量号n的中断服务程序存放在4n的物理地址处,物理地址,中断和子程序的比较,中断和子程序调用之间有其相似和不同之处。 它们的工作过程非常相似,即:暂停当前程序的执行,转而执行另一程序段,当该程序段执行完时,CPU都自动恢复原程序的执行,子程序调用一定是程序员在编写源程序时事先安排好的,是可知的,而中断是由中断源根据自身的需要产生的,是不可预见的(用指令INT引起的中断除外); 子程序调用是

15、用CALL指令来实现的,但没有调用中断的指令,只有发出中断请求的事件(指令INT是发出内部中断信号,而不要理解为调用中断服务程序);,主要差异,子程序的返回指令是RET,而中断服务程序的返回指令是IRET/IRETD。 在通常情况下,子程序是由应用系统的开发者编写的,而中断服务程序是由系统软件设计者编写的。,中断功能的分类,计算机系统有上百种中断,若按中断的性质来划分,则系统中的中断可分为:可屏蔽中断和不可屏蔽中断。对不可屏蔽中断,程序员不能控制它,系统肯定会立即响应的,而对于可屏蔽中断,汇编语言程序员可以通过指令CLI和STI来控制对它们的响应。,若按中断源来划分,则系统中的中断又可分为:硬

16、件中断和软件中断。对于硬件中断,程序员不能控制它,它们基本上是随机产生的,而对于软件中断,汇编语言程序员可通过指令INT和INTO来有目的安排它们的。,汇编语言程序员能控制的软件中断 常用的这类中断有:DOS功能调用(INT 21H)、BIOS中断、硬件和外设的中断等。,中断优先级(Interrupt Priority),在PC机系统中,有内中断,外中断等多个中断源,因此,可能会出现在同一时刻若干个中断源同时向CPU发出中断请求,这时CPU应如何处理呢?这就牵涉到优先级的问题。所谓优先级,即在处理中断时,按照事件的轻重缓急的程度所确定的先后处理次序。,中断服务程序采用过程定义伪指令定义,开始通常要执行STI指令开放可屏蔽中断,最后执行IRET指令返回。 内部中断服务程序通常采用寄存器传递参数。,主程序通过中断调用指令INT n执行内部中断服务程序。 主程序在调用内部中断服务程序之前,必须在中断向量表中设置中断服务程序的入口地址。,中断向量获取,;获

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

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