【vb精品源码栏目提醒】:网学会员,鉴于大家对vb精品源码十分关注,论文会员在此为大家搜集整理了“第六章 子程序 - 教育”一文,供大家参考学习!
第六章 子程序结构 子程序是提高程序设计效率的良好手段,也为模块化设计提供了很好的基础。
6.1 子程序的设计方法 6.1.1 过程定义伪操作 NEAR 过程名 PROC 属性 FAR 过程名 ENDP 助记符 符号地 址 NEAR: 调用和被调用过程在相同的代码段中 FAR :调用和被调用过程在不同的代码段中 与CALL和RET的属性相对应。
例如1. 调用程序和子程序在同一代码段中; MAIN PROC FAR MAIN PROC FAR CALL SUB1 CALL SUB1 或写成: RET 即过程可 RET 以嵌套。
MAIN ENDP SUB1 PROC NEAR SUB1 PROC NEAR RET RET SUB1 ENDP SUB1 ENDP MAIN ENDP例2. 调用程序和子程序不在同一代码段中. SEG1 SEGMENT SUB1 PROC FAR RET SUB1 ENDP CALL SUB1 在同一段内调用:可用属性NEAR SEG1 ENDSSEG2 SEGMENT CALL SUB1 在另一段调用:必须用 FAR属性,故SUB1过程必 须定义为FAR属性SEG2 ENDS子程序的调用与返回p198 要实现正确的调用和返回,子程序中对堆栈的使用非常重要!!!调用: CALL 过程名(或标号)执行:(1)段内调用 (PUSH IP IP 过程名地址)(2)段间调用(PUSH CS PUSH IP IP过程名地址 CS过程所处段地址返回 RET 1. CALL 调用指令 RET 返回指令 P98段内直接近调用 CALL DST SP←SP-2 PUSH IP SP1 SP←IP IP←IPD16 转移到子程序入口地址 RET IP←SP1 SP SP←SP2段内间接近调用 CALL DST SP←SP-2 PUSH IP SP1 SP←IP IP←EA 转移到子程序入口地址 RET IP←SP1 SP SP←SP2段间直接远调用: CALL DST SP←SP-2 PUSH CS SP1 SP←CS SP←SP-2 PUSH IP SP1 SP←IP IP←DST指定的偏移地址 CS← DST指定的段地址段间间接远调用: CALL DST SP←SP-2 PUSH CS SP1 SP←CS SP←SP-2 PUSH IP SP1 SP←IP IP←EA指定的偏移地址 CS← EA2指定的段地址返回指令RET段内返回 RET IP←SP1 SP POP IP SP←SP2段内带立即数返回 RET EXP IP←SP1 SP SP←SP2 表达式EXP的值决定D16 SP←SPD16 (修改堆栈指针) 利于子程序的参数调用(P100)段间返回 RET IP←SP1 SP POP IP SP←SP2 CS←SP1 SP POP CS SP←SP2段间带立即数返回 RET EXP IP←SP1 SP POP IP SP←SP2 CS←SP1 SP POP CS SP←SP2 SP←SPD16 (修改堆栈指针)CALL和RET指令不影响条件码注:主程序看成DOS的一个子过程,故用FAR属性。
子程序的调用和返回已包括了返回地址的出、入 栈,故在子程序中必须正确使用堆栈,否则将造 成运行错误。
哪些寄存器应保存:一般,子程序中用到的寄存器应保存。
不该保存:如果使用的寄存器是用来在主–––子程序之间传送参数或回送结果,则不该保存。
一)用寄存器传送参数 常用的方法 使用方便,但变量很多时不能使用例1:从键盘接受4个数字字符,将其转换成一个16进制数并显示。
分析:1键盘输入的4位十进制数ASCII,要将它转换成 二进制存放 。
子程序:DECIBIN 2 二进制转换成十六进制数并显示BINIHEX 3为避免屏幕上的重叠,必须有回车和换行功能。
CRLF 用三个子程序联合实现题目要求, 联合由主程 序达到。
将BX寄存器作为过程之间传送转换数据的 “交通员”。
那么主程序调用如下: (l63.asm) 开始 调DECIBIN 从键盘取得十进制数,存于BX中 调 CRLF 显示回车和换行 调BINIHEX 调 CRLF 用十六进制形式显示BX中数 结束Decihex segment assume cs:decihex Sp sp-2 sp1sp IP ——Main proc farRepeat: push ds 1000:0000 IP decibin 的偏移地址——0013 xor ax ax 1000:0001 push ax 1000:0003 call decibin 1000:0004 call crlf 1000:0007 call binihex 1000:000A call crlf ret sp 07Main endp 00子程序定义为NEAR BX←0 键盘输入数据 N 退出 数据在0~9D之间? Y 扩展成16位数做运算–––转换 10ab 结果存入BX