子程序的调用

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

子过程的调用与返回指令
3 .注意:
1)CALL 和RET均不影响标志
2)NEAR属性的过程,RET是段内返回,汇编后仍为RET;
如果是FAR属性的过程,RET是段间返回,汇编后RET 为 RETF.
3)段内调用返回只需设置IP
4)段间调用返回需设置IP和CS,多模块采用此设计方法
子过程的调用与返回指令
Findmax proc
mov ax,[si] Lp1: cmp ax,[si+2] jg next xchg ax,[si+2] next: add si,2 loop lp1 ret findmax endp Code ends
end main
参数的传递
举例2 从键盘输入一个十进制数(0~65535),将它转换成 16进制输出. 分析
参数的传递
2 参数传递方法: 寄存器传递参数 存储器传递参数 地址表传递变量地址 堆栈传递参数
参数的传递
寄存器传递参数
传递数据和地址。常用AL,AX,DX传递数据,SI,DI,BX传递地 址 用于入口参数较少的情况 举例:求带符号的字数组ARRAY的元素的最大值,元素的个数由变 量COUNT定义,最大值放在MAX 中 (1)分析: 定义一个查找最大值的子程序FINDMAX,通过主程序调用程序。 子程序的功能:将带符号的字数组 ARRAY 的首地址送寄存器SI。 元素的个数COUNT 送寄存器CX。 调用后,AX中结果送MAX中。
1)该程序定义三个子程序 子程序DECBIN 功能:从键盘输入的十进制数转换成二进制数放在 BX中 子程序CRLF完成回车换行的功能 子程序BINHEX功能:二进制转换成16进制. 2)该程序采用寄存器传送参数 3)在DECBIN子程序中,当键入”*”时,将寄存器SI设置1,然后退出 该子程序,继续执行其它子程序,最后判断SI的值是否为1,为1则结 束,否则执行循环.
参数的传递
1 参数传递: 当子程序被调用时,一般需要向子程序传递若干参数, 由子程序来对这些参数完成特定功能处理;当子程序 处理后,需要向调用它的主程序传递结果。这种主程 序和子程序之间的信息的传递称为参数的传递。 向子程序传递的参数称为子程序的入口参数,子程序 向调用它的程序传递的参数为子程序的出口参数。编 程时必须确定要处理数据和返回结果是采用何种方式 来实现参数传递。参数传递方式有四种:寄存器、存 储器、地址表、堆栈。
子程序的调用
子程序的结构

子程序的定义 子程序的调用与返回指令 子程序的编程原则 参数的传递
子程序的定义
1.基本概念
功能相对独立的一段程序. 输入\输出\处理过程均可编写为相应的子程序. 使程序的模块化,便于代码复用、简化编程。
2.子程序的定义
过程定义伪指令 过程名 PROC [NEAR/FAR] ;过程的开始,FAR、NEAR 过程的属性 过程体 RET 过程名 ENDP ;过程结束
4.子程序调用方式举例
分析下面程序段,说明各种调用子程序的方法和寻址方式: data segment nproc dw nearp fproc dd farp data ends code1 segment assume cs:code1,cs:data Main proc far


子程序的定义
3.注意问题
1)过程体内必须有一条RET指令被执行 proc1 proc mov ax,0 proc1 endp proc2 proc mov bx,-1 ret proc endp
子程序的定义
2)调用程序和过程在同一程序段时,属性选择NEAR,当调
用程序和过程不在同一程序段时,应选择FAR
mov ax,data mov ds,ax call nearp lea ax,nearp call ax call nproc lea bx,nproc call word ptr [bx]
call farp call fproc lea bx,fproc
Nearp proc near
…… ret Nearp endp Code1 ends end main code2 segment
子程序开始
保护现场,设置地址指针, 取第一个数如AX (2)流程图
主程序
初始化DS,数组首地址送SI 数组个数送CX N 调用子程序FINDMAX 找出数组的最大值
AX与下一数比较 AX大吗? Y 修改地址 CX=CX-1 ,CX=0? Y 恢复现场
N 数据交换
最大值送MAX
END
子程序结束
DATA SEGMENT count dw 5 Array dw -1 ,8,9 ,-2,4 Max dw ? Data ends Code segment assume cs:code ,ds:data Main proc far mov ax,data mov ds,ax lea si,array mov cx,count dec cx call findmax mov max,ax mov ah,4ch int 21h Main endp
返回地址的段地址 返回地址的偏移值
返回地址的段地址 返回地址的偏移值
子过程的调用与返回指令
例题:判断下列CALL指令的寻址方式:
1)PRO1 为过程名,属性为NEAR CALL PRO1 2)PRO2 为过程名,属性为FAR CALL PRO2 3)设过程的偏移地址在BX中,则有指令: CALL BX 4)设过程的偏移地址在[BX]中,则有指令: CALL [BX]
子过程的调用与返回指令
1)段内直接调用 SP=SP-2;SS:[SP] CALL下一条指令的IP IP =IP+D16 (DST为16位) 2)段内间接调用 SP=SP-2;SS:[SP] CALL下一条指令的IP IP =DST中的有效地址EA( DST为16位)
பைடு நூலகம்过程的调用与返回指令
3)段间直接调用 SP=SP-2 ;SS:[SP] SP=SP-2; SS:[SP] IP=DST的偏移地址 CS=DST的段地址 4)段间间接调用 SP=SP-2 ;SS:[SP] SP=SP-2; SS:[SP] IP=EA的低16位 CS=EA的高16位
子程序的编程原则
3)显示回车换行子程序 dispodoa proc push ax push dx mov ah,2h mov dl,0dh int 21h mov ah,2h mov dl,0ah int 21h Pop dx Pop ax Ret Dis0doa endp
子程序的编程原则
2.确定接口参数及参数传递方法
3)在调用时,NEAR 和FAR 可以强制改变 CALL FAR PTR NEARPROC CALL NEAR PTR FARPROC
子过程的调用与返回指令
子过程的调用是个”有去有回”的过程,子程序执行
完后必须返回CALL指令的下一条指令处,因此必须对
CALL指令的下条指令的地址进行保存.保存地址的操作 是通过堆栈来完成.不是采用PUSH \POP指令来实现,而
子过程的调用与返回指令
5)设过程地址在数据段addi所指的单元中,则有 指令: CALL DWORD PTR addi 6)设过程地址在[BX]中,则有指令: CALL DWORD PTR [BX]
子过程的调用与返回指令
2.
子程序的返回指令
指令格式:RET/RET N/RETF 指令功能: RET:返回地址出栈IP(段内) RETF:返回地址出栈IP(段内 段间)和CS寄存器(段间) RET N:返回地址出栈IP(段内 段间)和CS寄存器(段间) 再将N个(必须是偶数)字节数据弹出来,保持栈 的平衡。
pop dx pop cx ret binhex endp
crlf proc near push dx mov dl.0dh mov ah,02 int 21h mov dl,0ah mov ah,02 int 21h pop dx ret Crlf endp
参数的传递
练习:
1.完成例题2的程序 2.从键盘输入一个十进制数(0~65535),将它转换成十进 制输出.
xchg ax,bx add ax,bx jmp newchar Ext1: mov si,1 Ext2: pop cx pop ax ret Decbin endp
Binhex proc near push cx push dx mov ch,4 Lp: mov cl,4 rol bx,cl mov al,bl and al,0fh add al,30h cmp al,3ah jl print add al,7h print: mov dl,al mov ah,02h Int 21h dec ch jnz lp pop dx pop cx ret
assume cs:code2
Farp proc far ….
call dword ptr [bx] mov ah,4ch int 21h Main endp
ret
Farp ends Code2 ends
子程序的编程原则
1.分析题意,进行模块分解,画出流程图.
2.对子程序做说明.说明内容:子程序名,功能,入口参数,出 口参数,执行时间等
入口参数:把子程序执行前准备的值或地址称为入口参 数。是调用者提供给子程序的信息。
出口参数:把子程序返回值或地址称为出口参数。是子
程序运行后,返回调用者的信息。 保存入口参数和出口参数的方法:利用堆栈或寄存器
子程序的编程原则
3.保存环境信息 子程序是可共享的,可被不同的程序调用.所以子程序中 用到的寄存器的内容要保存,在子程序退出前要恢复寄 存器中的内容. 4.堆栈平衡 堆栈使用主要在:保存转移指令的返回断点、保存子 程序中用到的寄存器的内容、参数传递和子程序本身 用到的堆栈操作。保存堆栈平衡确保数据弹出的准确 性,使程序正确执行。
通过存储器来传递参数
当调用程序和子程序处于同一文件中,可以直接访问 块内的变量或数据。 举例3:编写程序从键盘上输入一个字符串,存于变量为INPUT中, 要求以回车键作为输入过程的结束,字符结尾部分添加0。 (1) 分析: 子程序getstring直接从键盘输入字符串,入口参数:无。出 口参数:字符串变量INPUT 变量INPUT 属于通过存储器传递参数,调用程序和子程序处 于同一文件在数据段定义变量属于局部变量
是用CALL\RET指令隐含完成.
子过程的调用与返回指令
1.子程序的调用指令
指令格式: CALL DST DST 是子程序的子程序名或子程序的首地址.可以采用与转移指令 有关的四种转移的寻址方式之一,即:段内直接调用\段内间接调用\ 段间直接调用\段间间接调用. 段内、段间:调用程序和子程序在同一段内,为段内调 用;否则 段间调用; 直接、间接:DST为子程序名(子程序首地址),是转移 地址,该有效地址直接出现在CALL指中; 若有效地址出现在寄存器中间接得到,则为间 接调用
子程序的编程原则
在主程序中调用子程序 …… mov dl,’a’ call display mov dl,0dh call display …..
子程序的编程原则
2)通过键盘获取一个字符的子程序
inputchar proc push ax mov ah,1 int 21h mov char ,al pop ax ret intputchar endp
3.主程序中的寄存器信息内容的保存和恢复
主程序调用和返回时断点信息的保存和恢复 4.注意堆栈的使用.压入与弹出的内容必须对应.
子程序的编程原则
1.切分子程序 根据程序的功能、结构和重复使用的程序段等特性完成子 程序的切分。 1)显示一个字符的子程序 display proc push ax mov ah,2 int 21h pop ax ret displsy endp
主程序流程图
开始
调用子程序DECBIN,从键盘 接受一个十进制并转化为对应的二进制 调用子程序CRLF实现回车换行 调用子程序BINHEX,把二进制数转换成 16进制并显示 调用子程序CRLF实现回车换行 Y 是否退出 N 接收下一次键盘输入 END
decbin PROC NEAR push ax push cx mov bx,0 mov si,0 Newchar: mov ah,1 int 21h cmp al,’*’ je ext1 sub al,30h jl ext2 cmp al,9 jg ext2 cbw xchg ax,bx mov cx,10 mul cx xchg ax,bx add ax,bx jmp newchar
相关文档
最新文档