第六章第八章汇编语言.ppt
文本预览下载声明
5、4CH号系统功能调用——返回操作系统 功能:结束当前正在执行的程序,并返回操作系统,屏幕显示操作系统提示符(C:\,C为当前使用的驱动器名)。 入口参数:无 出口参数:无 mov ah,4ch ;返回DOS int 21h * * * * * * 在程序设计中,我们会发现一些多次无规律重复的程序段或语句序列。解决此类问题一个行之有效的方法就是将它们设计成可供反复调用的独立的子程序结构,以便在需要时调用。在汇编语言中,子程序又称过程。 调用子程序的程序称为主调程序或主程序。 第6章 子程序结构 * 1. 过程定义伪操作 过程名 PROC NEAR ( FAR ) 过程名 ENDP . . . (1)NEAR属性:调用程序和子程序在同一代码段中 (段内调用) (2)FAR属性:调用程序和子程序不在同一代码段中 (段间调用) * code segment …… call subr1 …… subr1 proc near …… ret subr1 endp code ends seg1 segment subt proc far …… ret subt endp …… call subt …… seg1 ends seg2 segment …… call far ptr subt …… seg2 ends * 子程序调用:隐含使用堆栈保存返回地址 call near ptr subp (1) 保存返回地址 (2) 转子程序 call far ptr subp (1) 保存返回地址 (2) 转子程序 子程序返回:ret 2.子程序的调用与返回 (SP)→ (IP) (IP) (CS) (SP)→ * 3. 保存与恢复寄存器 subt proc far push ax push bx push cx push dx …… …… pop dx pop cx pop bx pop ax ret subt endp * (1) 通过寄存器传送参数 (2) 通过存储器传送参数 (3) 通过地址表传送参数地址 (4) 通过堆栈传送参数或参数地址 4. 子程序的参数传送 * 由于CPU中的寄存器在任何程序中都是“可见”的,一个程序对某寄存器赋值后,在另一个程序中就能直接使用,所以,用寄存器来传递参数最直接、简便,也是最常用的参数传递方式。但另一方面,CPU中寄存器的个数和容量都是非常有限,所以,该方法适用于传递较少的参数信息。 (1) 寄存器传递参数 * 例1:编写一个子程序UPPER,实现把寄存器AL中存放的字符变大写。 解: ;子程序功能:把AL中存放的字符变大写 ;入口参数:AL ;出口参数:AL ;算法描述:判断AL中字符必须在’a’~’z’之间才能把该字符变为大写 UPPER PROC CMP AL, ‘a’ JB over CMP AL, ‘z’ JA over SUB AL, 20H over: RET UPPER ENDP 子程序处理的数据被保存在寄存器AL中。假设有下列的程序段: … MOV AL, ‘b’ CALL UPPER ;子返回时(AL)=? … MOV AL, ‘2’ CALL UPPER ;子返回时(AL)=? * (2) 通过存储器传送参数 在调用子程序时,当需要向子程序传递大量数据时,因受到寄存器容量的限制,就不能采用寄存器传递参数的方式,而要改用约定存储单元的传送方式。 所处理的数据不是直接传给子程序,而是把存储它们的地址告诉子程序。 例:累加数组中的元素(通过存储器传送参数) data segment ary dw 1,2,3,4,5,6,7,8,9,10 count dw 10 sum dw ? data ends code segment assume cs:code,ds
显示全部