|
|
|
→ 子程序的参数传递 |
|
子程序一般都是完成某种特定功能的程序段。当一个程序调用一个子程序时,通常都向子程序传递若干个数据让它来处理;当子程序处理完后,一般也向调用它的程序传递处理结果,我们称这种在调用程序和子程序之间的信息传递为参数传递。
用程序向子程序传递的参数称为子程序的入口参数,子程序向调用它的程序传递的参数称为子程序的出口参数。子程序的入口参数和出口参数都是任意项,对某个具体的子程序来说,要根据具体情况来确定其入口和出口参数,也可以二者都没有。
程序和被调用子程序之间的参数传递方法是程序员自己或和别人事先约定好的信息传递方法。这种信息传递方法可以是多种多样的,在本节,我们只介绍常用的、行之有效的参数传递方法有:寄存器传递参数、约定存储单元传递参数和堆栈传递参数等。如果对其它的参数传递方法感兴趣的话,可参考其它《汇编语言程序设计》书籍。
一方面,由于CPU中的寄存器在任何程序中都是“可见”的,一个程序对某寄存器赋值后,在另一个程序中就能直接使用,所以,用寄存器来传递参数最直接、简便,也是最常用的参数传递方式。但另一方面,CPU中寄存器的个数和容量都是非常有限,所以,该方法适用于传递较少的参数信息。
例7.1是用寄存器传递参数的例子,子程序处理的数据被保存在寄存器AL中。假设有下列的程序段:
| … | |||
| MOV | AL, 'b' | ||
| CALL | UPPER | ;子返回时,(AL)='B' | |
| … | |||
| MOV | AL, '2' | ||
| CALL | UPPER | ;子返回时,AL的值不变,因为'2'不是字母 | |
| … | |||
例7.3 按五位十进制的形式显示寄存器BX中的内容,如果BX的值小于0,则应在显示数值之前显示负号'-'。
例如:(BX)=123,显示:00123;(BX)=-234,显示:-00234;
| 解: | ||||
| ;子程序功能:把寄存器BX的内容按十进制有符号数显示出来 | ||||
| ;入口参数:BX | ||||
| ;出口参数:无,只有显示信息 | ||||
| ;算法描述: | 1、定义6个字节的存储单元 2、先判断BX是否小于零,如果是,则先显示负号'-',再取BX的绝对值; 3、采用除10,得余数的方法,从低位向高位求出每位十进制位; 4、输出数据的字符串。 |
|||
| SubData | SEGMENT | |||
|
DB |
5 DUP('0'), 0ah, 0dh, '$' ;0ah、0dh:换行、回车 | |||
| SubData | ENDS | |||
| DISPBX | PROC | |||
| ASSUME | DS:SubData | |||
| PUSH | DS | |||
| PUSH | DX | |||
| PUSH | CX | |||
| PUSH | AX | |||
| MOV | AX, SubData | ;取子程序所用的数据区段地址 | ||
| MOV | DS, AX | |||
| CMP | BX, 0 | |||
| JGE | next | |||
| MOV | DL, '-' | |||
| MOV | AH, 2 | |||
| INT | 21H | ;显示负号'-' | ||
| NEG | BX | ;求-BX,使其值为正数 | ||
| next: | MOV | SI, 4 | ||
| MOV | AX, BX | |||
| MOV | CX, 10D | |||
| again: | XOR | DX, DX | ||
| IDIV | CX | ;DX存放余数,AX存放商 | ||
| ADD | DL, '0' | |||
| MOV | [SI], DL | |||
| DEC | SI | |||
| JGE | again | |||
| XOR | DX, DX | |||
| MOV | AH, 9 | |||
| INT | 21H | ;调用中断21的功能9,显示DS:DX指向的字符串 | ||
| POP | AX | |||
| POP | CX | |||
| POP | DX | |||
| POP | DS | |||
| RET | ||||
| DISPBX | ENDP | |||