主程序与⼦程序之间的参数传递的四种⽅法
主程序调⽤⼦程序是,往往需要向⼦程序传递⼀些参数,同样,⼦程序运⾏的时候也需要把⼀些结果参数传回给主程序,主程序与⼦程序之间的这种信息传递称为参数传递,我们把主程序传给⼦存续的参数称为⼦程序的⼊⼝参数,把由⼦程序传给主程序的参数称为⼦程序的出⼝参数
有多种传递参数的⽅法,寄存器传递法,约定内存单元传递法,堆栈传递法和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小时内删除。