07第七章子程序.pptVIP

  • 4
  • 0
  • 约4.82千字
  • 约 28页
  • 2018-06-24 发布于河南
  • 举报
07第七章子程序

第七章 子程序设计 第九章 宏的编写 上节回顾 DOS功能调用 AH←功能号 INT 21h 中断概念 中断向量表 主要内容 子程序 子程序的过程定义 子程序的参数传递 子程序的嵌套、递归与重入 宏 宏的定义与引用 宏与子程序的区别 子程序过程定义伪语句 格式: 【例1】 编写子程序:实现把一个16进制数转换成对应的ASCII码。 参数传递 子程序的参数传递 利用寄存器传递参数 利用约定存储单元传递参数 利用堆栈传递参数 参数传递 无参数传递的子程序 ;子程序功能:实现换行、回车功能 enpro proc push ax push dx ; 保护ax和dx寄存器 mov dl,0dh mov ah,2 int 21h ; 调用21h中断的2号功能,回车 mov dl,0ah mov ah,2 int 21h ; 调用21h中断的2号功能,换行 pop dx pop ax ret ; 子程序返回 enpro endp ; 子程序过程结束 1.利用寄存器传递参数 优点:实现简单、调用方便 缺点:寄存器个数有限 适用情况: 参数较少 data segment array db 12h,25h,0f0h,0a3h,68h,0cah,0ffh count equ ($-array)/type array result db ? data ends mov ax,data mov ds,ax mov bx,offset array mov cx,count call checksum mov result, al mov ax,4c00h int 21h checksum01 proc …… checksum01 endp end 利用CF作为出口参数 【例3】写一个判别字符是否为数字符的子程序。并利用该子程序把一个字符串中的所有字符删除。 2. 利用约定存储单元传递参数 优点:要处理数据或送出结果都有独立的存储单元,不易出错。 缺点: 要占用一定的存储单元,通用性较差 适用情况:参数较多时 checksum02 proc push ax push bx push cx xor al,al mov bx,offset array mov cx,count 3. 利用堆栈传递参数 利用堆栈传递入口参数 利用堆栈传递出口参数 mov ax,data mov ds,ax mov ax,offset array push ax mov ax,count push ax call checksumc add sp,4 ;主程序平衡堆栈 mov result ,al 入口参数(1~n)在调用子程序前压入栈中 调用子程序的同时,段内调用 压入当前IP,段间调用 压入当前 CS和IP 在子程序中调用参数时,要注意参数在堆栈中的位置 一般采用SS段的相对寄存器寻址方式查找参数[BP+n] 【例4】写一个测量字符串长度的子程序,设字符串以0为结束标志。 STRLEN Proc push bp mov bp,sp push dx push si mov ds,[bp+6] mov si,[bp+4] xor al,al 调用STRLEN的主程序 …… mov ax,seg strmess push ax mov ax,offset strmess push ax call strlen add sp,4 mov len,ax 子程序的完全定义 完全定义格式: 子程序的应用 【例5】从键盘输入有符号10进制的子程序。 例题3-1/5 .data count = 10 array dw count dup(0) ;预留数据存储空间 .code .startup mov cx,count mov bx,offset array again: call read ;调用子程序输入一个数据 mov [bx],ax ;将出口参数存放缓冲区 inc bx inc bx call dpcrlf ;调用子程序,光标回车换行以便输入下一个数据 loop again .exit 0 例题3-2/5 ;输入有符号10进制数的通用子程序 ;出口参数:AX=补码表示的二进制数值 ;说明:负数用“-”引导,正数用“+”引导或直接输入;数据范围是+32767~-32768 read proc push bx push cx push dx xor bx,bx ;BX保存结果 xor cx,cx ;CX为正负标志,0为正,-1为负

您可能关注的文档

文档评论(0)

1亿VIP精品文档

相关文档