跟我一起学编程系列课程: 第一篇汇编语言 16位汇编
第三部分汇编语言程序设计基础 第二节 子程序设计 ●子程序设计 ●参数传递 ●递归和重入
参数传递 分类 1.寄存器传参 2.约定内存单元传参 3.堆栈传参 4.call后续区传参 1、利用寄存器传递参数 优点:简单方便 缺点:寄存器数量有限,适用参数较少的情况
参数传递 例1:写一个把大写字母改写为小写字母的子程序 ;子程序名:uptolw ;功能:大写字母转换为小写字母 ;入口参数:AL=字符ASCII码 ;出口参数:AL=字符ASCII码 ;说明:如果字符是大写字母,则转换为小写字母,其他字符不变 ;---------------------------------------------------------- uptolw proc pushf ;保护标志寄存器 cmp al,'A' jb uptolw1 cmp al,'Z' ja uptolw1 add al,'a'-'A' ;可以直接写20h uptolw1: popf ;恢复标志寄存器 ret uptolw endp
参数传递 ;例2:一个判别字符是否为数字符的子程序。并利用该子程序把一个字符串中的所有数字符删除。 ;程序名:t4-2.asm ;功能:判断数字字符并删除 ;CF为0表示数字符,CF=1为非数字符 ;------------------------------- assume cs:code,ds:data data segment string db 'AB=C950-asd',0 ;假设的字符串 data ends code segment ;子程序名:isdecm ;功能:判别一个字符是否是数字符, ;入口参数:AL=字符 ;出口参数:CF为0表示数字符,CF=1为非数字符 ;说明:不需要保护寄存器 isdecm proc cmp al,'0' jb isdecm1 cmp al,'9' ja isdecm1 clc ;cmp影响标志位 ret isdecm1: stc isdecm endp
参数传递 start: mov ax,data mov ds,ax mov si,offset string ;置取指针 mov di,si ;置存指针 next: mov al,[si] inc si or al,al ;判断是否0结尾 jz ok call isdecm jnc next ;CF=0,是数字字符,不保存,下一个字符 mov [di],al inc di jmp next ok: mov [di],al mov ax,4c00h int 21h code ends end start
参数传递 2、利用约定存储单元传递参数 在参数较多的情况下,可以利用约定内存变量来传递参数。 优点:数据或送出的结果都有独立的存储单元,不容易出错。 缺点:占用存储单元,通用性差 ;例3:写一个实现32位数相加的子程序 ;子程序名:madd ;功能:32位数相加 ;入口参数:data1和data2缓冲区存放要相加的32位数 ;出口参数:data3缓冲区存放结果 ;说明:1.32位数据的存放依次采用‘高高低低’的原则;2.可能产生进位存放在data3开始的第5字节中 ;--------------------------------------------------------- madd proc push ax 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] ;16位相加 mov word ptr data3[si],ax inc si loop madd1 mov al,0 ;进位处理 adc al,0 mov byte ptr data3+4,al pop si pop cx pop ax ret madd endp
参数传递 n ...... DS:BX n个十进制数字 缓冲区结构图 设十进制数字串各位对应的BCD码是dn、dn-1、...、d2、d1 ;例4:设计一个以ASCII码表示的十进制数字串转换为二进制数的子程序。设表示的十进制数不大于65535。 ;子程序名:dtobin ;功能:把用ASCII码表示的十进制数字串转换为二进制数 ;入口参数:DS:BX=缓冲区首地址,第一个字节为十进制数字串长度n ;出口参数:AX=转换得到的二进制数 ;算法:迭代法y=y*10+di,y初始值为0 ;--------------------------------------------------- dtobin proc push bx push cx push dx xor ax,ax mov cl,[bx] inc bx xor ch,ch ;cx=n jcxz dtobin2 dtobin1: mov dx,10 mul dx ;ax=Y*10 mov dl,[bx] ;取下一个数字符 and dl,0fh xor dh,dh add ax,dx loop dtobin1 dtobin2: pop dx pop cx pop bx ret dtobin endp ;这个程序有两点不足,一是没有检查数字串中是否有非十进制数字符的存在,二是不适用于大于65535 DS:BX n ...... n个十进制数字 缓冲区结构图 设十进制数字串各位对应的BCD码是dn、dn-1、...、d2、d1 那么它所表示的二进制数可由下式计算出: Y=((((0*10+dn)*10+dn-1)*10+...)*10+d1 迭代公式:Y=Y*10+di (i=n,n-1,...1),Y初始值为0
本节视频的课后练习 1、在汇编语言中,主程序和子程序之间如何传递参数?请举例说明每种方法,并进行比较 2、编写一个求32位补码的程序。通过寄存器传递出入口参数 课后练习请务必完成后,再继续学习后面的课程。官网视频播放页面有参考答案。
0512-57882866 www.bcdaren.com 昆山爱达人 1250121864 昆山爱达人信息技术有限公司 视频录制:编程达人 视频提供 视频录制:编程达人 联系电话: 0512-57882866 官网地址: www.bcdaren.com 联系公众号: 昆山爱达人 联系QQ: 1250121864 编程达人APP: