c语言子程序回到主程序指令,第八章子程序与中断调用.ppt

第八章子程序与中断调用

8.3 子程序与主程序间的参数传递 用高级语言实现的程序,其主程序与子程序之间的参数传递方法是由编译系统来规定的。 一般是采用堆栈或者参数区(地址表)来进行参数的传递。 * 子程序总结: 1.主程序用CALL指令调用子程序,子程序执行完后用RET指令返回到主程序的CALL指令的下一条指令; 2.主程序有段内调用(NEAR)和段间调用(FAR),子程序返回对应有段内返回和段间返回; 3.主程序可通过寄存器﹑堆栈﹑地址表以及约定的内存变量向子程序传递参数; 4.凡在子程序中用到的寄存器必须先送堆栈,返回前按送栈相反的次序出栈; 5.注意子程序调用时堆栈指针的变化; * 8.4 系统服务子程序 除用户设计的子程序外,操作系统还提供大量的系统服务子程序,通常称为中断服务程序。 这类程序通常用于完成必要的输入/输出功能和一些必要的系统操作。 * 8.4 系统服务子程序 调用系统服务子程序的方式有两种: 一种是硬件中断,这种方式不为程序所控制; 另一种是软件调用的方式,由程序中的中断调用指令来完成的,程序员可以决定何时使用这种调用。 * 8.4 系统服务子程序 调用系统服务子程序一般不使用CALL指令,而是使用中断调用指令,格式如下: INT 中断号 * INT指令的执行过程 (1)标志寄存器、CS、IP依次压入堆栈(保存标志寄存器,延续了硬件中断调用的特征) (2)IF、TF标志位清0(禁止其它可屏蔽中断和单步中断) (3)由中断号计算中断服务子程序的入口地址(需使用中断向量表,在后面介绍),取得入口地址以后,修改CS和IP,使流程转向中断服务子程序入口。 * 由中断号计算中断入口地址 中断向量表:内存中最低地址端1K字节为中断向量表,其中每2个字保存一个中断入口地址。 中断入口地址 = (中断号 * 4) * IRET指令与中断调用返回 与普通子程序类似,中断服务子程序执行完毕后,将程序流程返回到主程序,最后一条执行的指令是中断返回指令。 IRET 功能:从堆栈中出栈三个字,依次恢复到IP、CS、标志寄存器FR。 * BIOS调用与DOS调用 DOS中断调用 用户程序 BIOS中断调用 * 常用的系统调用 INT 21H:DOS提供的服务子程序 INT 16H:BIOS服务,处理键盘输入 INT 10H:BIOS服务,处理显示器输出 INT 13H:BIOS服务,处理磁盘的基本输入、输出 * 子程序调用和中断调用的差别 1.指令: CALL/RET INT n/IRET 2.入口地址:由主程序通过寻址方式给出 由中断号(AH的值)计算给出 3.现场保护:IP(段间调用加CS)入栈 IP,CS,FLAGS入栈 * INT 21H常用的功能 输入单个字符并回显;AH=01H 显示单个字符;AH=02H 输入字符串并回显;AH=0AH 显示字符串;AH=09H * 输入单个字符并回显 21H号调用的01H号子功能: 从键盘等待一个按键; 有按键发生时,将输入字符的ASCII码保存到AL(出口参数); 并在屏幕上当前光标位置回显该字符,光标向右移动一个字符位置,自动换行、滚屏。 * 输入单个字符并回显 MOV AH,01H INT 21H * 显示单个字符 21H号调用的02H号子功能: DL中内容解释为ASCII码(入口参数); 将DL中指定的字符在当前光标位置显示,光标向右移动一个字符位置,自动换行、滚屏。 * 显示单个字符 例:在当前光标位置显示字符A MOV DL, ‘A’ MOV AH, 02H INT 21H * 输入字符串并回显 21H号调用的0AH号子功能 入口参数: (DS)为字符串缓冲区所在段的段基值。 (DX)为字符串缓冲区首字节偏移量。 (DS:DX)约定的缓冲区最大字符数。 出口参数: (DS:DX+1)为系统调用返回的实际字符数。 * 输入字符串并回显 从键盘接收多个字符,将字符按照接收顺序由低地址到高地址保存在指定的缓冲区中。 在屏幕上回显字符串,光标移动到字符串末尾。 若输入回车键,则系统调用返回;若达到约定的最大字符数,则系统调用不再接收字符,通过扬声器发出警报。 返回前,系统调用将实际字符数保存到缓冲区第一个字节。 * 输入字符串并回显 例: data segment maxlen db 10 db ? str1 db 10 dup(0)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值