主程序与子程序之间的参数传递的四种方法

主程序调用子程序是,每每须要向子程序传递一些参数,一样,子程序运行的时候也须要把一些结果参数传回给主程序,主程序与子程序之间的这种信息传递称为参数传递,咱们把主程序传给子存续的参数称为子程序的入口参数,把由子程序传给主程序的参数称为子程序的出口参数html

有多种传递参数的方法,寄存器传递法,约定内存单元传递法,堆栈传递法和CALL后续传递法ide

4.2.1利用寄存器传递参数spa

利用寄存器传递参数就是把参数放在约定的寄存器中,这种方法的优势是实行啊你个简单和调用方便,可是因为寄存器的个数有限,而且寄存器每每还须要存放其余数据所以只适合传递参数比较少的状况code

写一个把大写字母转换成小写字母的子程序htm

 1 ;子程序名 UPTOLW
 2 ;功能: 把大写字母转换成小写字母
 3 ;入口参数:AL = 字符ASCII码
 4 ;出口参数:AL = 字符ASCII码
 5 ;说明:若是字符是大写字母则转换为小写字母,其余的字符保持不变
 6 UPTOLW        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利用约定的存储单元传递参数blog

在传递参数较多的状况下,能够利用约定的内存变量来传递参数,这种方法的优势是子程序要处理的数据或送出的结果都有独立的存储单元,编写程序的时候不容易出错内存

可是,这种方法要占用必定的存储单元而且通用性较差字符串

实现32位数值的相加get

;子程序名:MADD
;功能: 32位数据的相加
;入口参数:DATA1和DATA2缓冲区中分别存放要相加的32为数据
;出口参数:DATA3缓冲区中的存放的结果
;说明:32位数据的存放采用高高低低的原则
;可能产生的经纬存放在DATA3开始的第5个字节中event

 1 ;子程序名:MADD
 2 ;功能: 32位数据的相加
 3 ;入口参数:DATA1和DATA2缓冲区中分别存放要相加的32为数据
 4 ;出口参数:DATA3缓冲区中的存放的结果
 5 ;说明:32位数据的存放采用高高低低的原则
 6 ;可能产生的经纬存放在DATA3开始的第5个字节中
 7 ;
 8 MADD        PROC
 9                     PUSH        AX
10                     PUSH      CX
11                     PUSH        SI
12                     MOV        CX,2
13                     XOR        SI,SI
14 MADD1: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 
 6 STRLEN        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系列中使用的很少

 

版权全部,转载请注明连接地址:http://www.cnblogs.com/fengdashen/p/3705271.html

相关文章
相关标签/搜索