当前位置:文档之家› 第十三次课 4-7子程序说明文件(微机原理)

第十三次课 4-7子程序说明文件(微机原理)

4.3 汇编语言程序设计的基本方法
一、程序设计步骤 二、源程序的汇编、连接与调试 三、IBM PC 汇编语言程序源程序的完整结构及伪指令 四、顺序结构 五、分支结构
六、循环结构
七、子程序 八、DOS系统功能调用 九、字符串处理 十、宏指令
七、 子程序
1、过程定义
六、 子程序
概念:子程序为功能确定、且独立的程序段。
优点:
1. 可以将任何一段独立的程序归整为一个子程序, 当需要该段程序时,只需调用子程序即可,调 用后会自动返回到调用指令的下一条指令。因 此采用子程序设计时,可以简化程序设计。 2. 从调试程序的角度,由于原本在多处出现的程 序段,缩减为子程序调用指令,使调试程序更 加方便。
六、 子程序
缺点:
采用子程序设计后。由于调用子程序和从子程序 中返回需要执行指令,并且为保护某些寄存器的 内容,需要进行压入堆栈和弹出堆栈的操作,因
4、子程序说明文件
六、 子程序
5、过程的嵌套、递归调用

过程的嵌套

递归调用 当子程序嵌套 时,若某子程序 要调用的子程序 就是其本身,则 称为递归调用。
六、 子程序
例1 子程序设计,编写子程序实现统计 一个字(AX)中“1”的个数。 解:利用移位指令或循环移位指令,每次 对CF位进行检测: 当CF=1时,则总个数加1; 当CF=0时,则总个数不变。 这种操作可以采用有条件转移指令来实现, 也可采用方便的ADC指令实现。子程序如 下:
六、 子程序
例2 编写程序,完成将一组BCD 数转换成16 位二进制数。 (BCD 数转换成16 位二进制数用子程序实现)
BCD 数转换成16 位二进制数的算法步骤为: ①DX=0;(用DX 存放结果) ②取要转换的一组BCD 数中的高位→(AX) ③(DX)=(DX)*10+(AX); ④重复②、③两步,直到BCD 码的所有位都转子程序间的参数传递


入口参数:将主程序给子程序提供的初始数据或 获得初始数据的信息称为子程序的入口参数。 出口参数:子程序返回给主程序的结果称为子程 序的出口参数。 参数传递可用以下3种方法完成 : *利用寄存器 *利用内存单元(变量)传递参数。 *利用堆栈
六、 子程序

CALL FAR PTR TIMER CALL DWORD PTR [SI]

六、 子程序
返回指令

入口 地址
从堆栈中弹出断点地址,返回源程序。
格式: RET RETF
段内返回(近返回)
段间返回(远返回)
断点
近返回:从栈顶弹出两个字节内容送IP, SP内容加2 远返回:从栈顶弹出四个字节内容分别 送CS和IP,SP内容加4
此会使程序执行速度受到一定的影响。
六、 子程序
实现: 子程序调用是通过自动修改(IP)和/或(CS) 的内容实现的。 为了确保子程序调用后能够返回到调用指令之后, CALL指令会自动保存返回地址(IP和/或CS),
而RET指令会自动返回到CALL指令的下一条指令。
六、 子程序
2、调用和返回指令 CALL指令: 段内调用 段内直接调用 段内间接调用 段间直接调用 段间间接调用
段间调用
(cs)
(IP)
六、 子程序
段内调用

子过程与原调用程序在同一代码 段,在调用之前会自动把断点的 偏移地址压栈(调用指令的下一 条指令的地址)
断点
入口 地址

CALL TIMER

CALL WORD PTR [SI]
六、 子程序
段间调用

子过程与原调用程序不在同一代码段,在调用 之前会自动把断点的段基地址和偏移地址压栈。 先将断点的CS压栈,再压入IP。
六、 子程序
COUNTER1 PROC NEAR PUSH AX MOV CX,16 XOR BL,BL COU1: SHR AX,1 ADC BL,0 LOOP COU1 POP AX RET COUNTER1 ENDP
六、 子程序
例1 子程序应用。利用上例设计的子程序,统 计字型变量VAR1中1的个数。 解:在数据段中定义变量VAR1和CounterVar1: VAR1 DW 1234H CounterVar1 DB ? 则可在代码段中编写程序: MOV AX, VAR1 CALL COUNTER1 MOV CounterVar1,BL 执行后,结果单元CounterVar1的值为5,说明 1234H中包含有5个“1”。
相关主题