主程序与⼦程序之间的参数传递的四种⽅法
主程序调⽤⼦程序是,往往需要向⼦程序传递⼀些参数,同样,⼦程序运⾏的时候也需要把⼀些结果参数传回给主程序,主程序与⼦程序之间的这种信息传递称为参数传递,我们把主程序传给⼦存续的参数称为⼦程序的⼊⼝参数,把由⼦程序传给主程序的参数称为⼦程序的出⼝参数
有多种传递参数的⽅法,寄存器传递法,约定内存单元传递法,堆栈传递法和CALL后续传递法
4.2.1利⽤寄存器传递参数
利⽤寄存器传递参数就是把参数放在约定的寄存器中,这种⽅法的优点是实⾏啊你个简单和调⽤⽅便,但是由于寄存器的个数有限,并且寄存器往往还需要存放其他数据因此只适合传递参数⽐较少的情况
写⼀个把⼤写字母转换成⼩写字母的⼦程序
1;⼦程序名 UPTOLW
2;功能:把⼤写字母转换成⼩写字母
3 ;⼊⼝参数:AL =字符ASCII码
4 ;出⼝参数:AL =字符ASCII码
5;说明:如果字符是⼤写字母则转换为⼩写字母,其他的字符保持不变
6UPTOLW PROC
7 PUSHF
8 CMP AL,'A'
9 JB UPTOLW1
10 CMP AL,'Z'
11 JA UPTOLW1
12 ADD AL,'a' - 'A'
13 UPTOLW1:POPF
14 RET
15 UPTOLW ENDP
View Code
4.2.2利⽤约定的存储单元传递参数
在传递参数较多的情况下,可以利⽤约定的内存变量来传递参数,这种⽅法的优点是⼦程序要处理的数据或送出的结果都有独⽴的存储单元,编写程序的时候不容易出错
但是,这种⽅法要占⽤⼀定的存储单元并且通⽤性较差
实现32位数值的相加
;⼦程序名:MADD
;功能: 32位数据的相加
;⼊⼝参数:DATA1和DATA2缓冲区中分别存放要相加的32为数据
;出⼝参数:DATA3缓冲区中的存放的结果
;说明:32位数据的存放采⽤⾼⾼低低的原则
;可能产⽣的经纬存放在DATA3开始的第5个字节中
1;⼦程序名:MADD
2;功能: 32位数据的相加
3;⼊⼝参数:DATA1和DATA2缓冲区中分别存放要相加的32为数据
4;出⼝参数:DATA3缓冲区中的存放的结果
5;说明:32位数据的存放采⽤⾼⾼低低的原则
6;可能产⽣的经纬存放在DATA3开始的第5个字节中
7;
8MADD PROC
9 PUSH AX
10 PUSH CX
11 PUSH SI
12 MOV CX,2
13 XOR SI,SI
14MADD1:MOV AX,WORD PTR DATA1[SI]
15 ADC AX,WORD PTR DATA2[SI]
16 MOV WORD PTR DATA3PSI],AX]
17 INC SI
18 INC SI
19 LOOP MADD1
20 MOV AL,0
21 ADC AL,0
22 MOV BYTE PTR DATA3+4,AL
23 POP SI
24 POP CX
25 POP AX
26 RET
27 MADD ENDP
View Code
因为是32位数和32位数相加,因此加法运算要进⾏两次,⾸先进⾏低两字节的相加,然后在做⾼两字节相加,在⾼两字节相加的情况,要把
低两字节相加的进位标志考虑进去
4.2.3利⽤堆栈传递参数
如果使⽤堆栈传递⼊⼝参数,那么主程序在调⽤⼦程序之前,把需要传递的参数依次压⼊堆栈,⼦程序从堆栈中取⼊⼝参数,如果使⽤堆栈传递出⼝参数,那么⼦程序在返回前,把需要返回的参数存⼊堆栈,主程序在堆栈中取出⼝参数即可
利⽤堆栈传递参数可以不⽤占⽤寄存器,也⽆需额外使⽤存储单元,由于参数和⼦程序的返回地址混在⼀起,有事还要考虑保护寄存器,所以⽐较复杂,通常利⽤堆栈传递参数的⼊⼝参数,⽽利⽤寄存器传递出⼝参数
;⼦程序名:STRLEN
;功能:测量字符串的长度
;⼊⼝参数:字符串起始地址的段值和偏移在堆栈中
;出⼝参数:AX = 字符串长度
1;⼦程序名:STRLEN
2;功能:测量字符串的长度
3;⼊⼝参数:字符串起始地址的段值和偏移在堆栈中
4 ;出⼝参数:AX =字符串长度
5
6STRLEN PROC
7 PUSH BP
8 MOV BP,SP
9 PUSH DS
10 PUSH SI
11 MOV DS,[BP+6]
12 MOV SI,[BP+4]
13 MOV AL,0
14 STRLEN1:CMP AL,[SI]
调用子程序的例子
15 JZ STRLEN2
16 INC SI
17 JMP STRLEN1
18 STRLEN2:MOV AX,SI
19 SUB AX,[BP+4]
20 POP SI
21 POP DS
22 POP BP
23 RET
24 STRLEN ENDP
View Code
4.2.4利⽤CALL后续区传递参数
CALL后续曲是指位于CALL指令后的存储区,主程序在调⽤⼦程序之前,把⼊⼝参数存⼊CALL指令后⾯的存储区,⼦程序根据保存在堆栈中的返回地址到⼊⼝参数,这种传递参数的⽅法称为CALL后续传递参数法,由于这种⽅法吧数据和代码混在⼀起,在x86系列中使⽤的不多
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论