汇编语言-子程序.ppt
文本预览下载声明
本章学习要点: (1)子程序的编写格式 (2)子程序调用时的参数传递方法 (3)嵌套及递归子程序 一、过程定义语句(process) 利用过程定义伪指令语句,可把程序片段说明为具有近类型或远类型的过程,并且能给过程取一个名字。 过程定于语句的格式如下: 过程名 PROC [NEAR | FAR] … 过程名 ENDP 过程的类型在过程定义开始语句PROC中指定; 过程可以被指定位近(NEAR)类型,也可以被指定为远类型。如果不指定,则通常默认为近类型; 定义一个过程的开始语句PROC和结束语句ENDP前使用的过程名称必须一致,从而保持配对。 像普通标号一样,过程名具有段值、偏移和类型这三个属性。 过程名的段值和偏移是对应过程入口(过程定义开始伪指令语句后的指令语句)的段值和偏移。 例:下面程序片段运行后,AL=?,BL=?。 XOR AL , AL CALL SUBS MOV BL , AL CALL SUBS RCR AL , 1 HLT ;停机,halt SUBS PROC NEAR NOT AL JS NEXT STC ;CF=1, SeT Cf = 1 NEXT : RET SUBS ENDP 例:用程序调用的方法,完成一个把16位二进制数转换为4位十六进制ASCII码的转换程序。 子程序说明:入口参数:DX=欲转换的二进制数; DS:BX=存放转换所得ASCII码串的缓冲区首地址,转换后的ASCII码串按照高位到低位的次序存放在指定的缓冲区中。 HTASCS PROC RET MOV CX , 4 HTASCS ENDP HTASCS1: ROL DX , 1 HTOASC PROC NEAR ROL DX , 1 AND AL , 0FH ROL DX , 1 ADD AL , 30H ROL DX , 1 CMP AL , 39H MOV AL , DL JBE HTOASC1 CALL HTOASC ADD AL , 7 MOV [BX] , AL HTOASC1: RET INC BX HTOASC ENDP LOOP HTASCS1 二、主程序与子程序间的参数传递 主程序在调用子程序时,往往要向子程序传递一些参数;同样地,子程序运行后夜经常要把一些结果传会给主程序。主程序和子程序之间的这种信息传递称为参数传递。 有多种参数传递的方法: (1)寄存器传递法 (2)约定内存单元传递法 (3)堆栈传递法 (4)其它方法 1.利用寄存器传递参数 利用寄存器传递参数就是把参数放在约定的寄存器中。这种方法适用于传递参数较少的情况。 例:写一个大写字母转换为小写字母的子程序 ;子程序名:UPTOLW ;功能:大写字母转换为小写字母 ;入口参数:AL=字符的ASCII码 ;出口参数:AL=字符的ASCII码 ;说明:如字符为大写字母,则转换为小写,其它字符不变。 UPTOLW PROC PUSHF ;保护各标志 CMP AL , ‘A’ JB UPTOLW1 CMP AL , ‘Z’ JA UPTOLW1 ADD AL , 20H UPTOLW1:POPF ;恢复各标志 RET UPTOLW ENDP 2.利用约定存储单元传递参数 在传递参数较多的情况下,可利用约定的内存变量来传递参数。 例:写一个实现32位数相加的子程序 ;子程序名:MADD ;功能:32位数相加 ;入口参数:DATA1和DATA2缓冲区中分别存放要相加的数 ;出口参数:DATA3缓冲区存放结果 ;说明: ;(1)32位数据的存放次序采用“高高低低”原则 ;(2)可能产生的进位放在DATA3开始的第5字节中 MADD PROC PUSH AX ;为什么会把AX,CX,SI压入栈? PUSH CX PUSH SI MOV CX , 2 XOR SI , SI ;CF也会被清0 MADD1:MOV AX , WORD PTR DATA1[SI] ADC AX , WORD PTR DATA2[SI] MOV WORD PTR DATA3[SI] , AX INC SI INC SI POP SI LOOP MADD1 POP CX MOV AL , 0 POP AX ADC AL , 0 RET
显示全部