版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
微型计算机原理及应用刘革制作4.6子程序设计4.6.1子程序概述4.6.1子程序概述分析:1.计算该函数需要多次使用求绝对值运算,
2.唯一差别是对程序变量赋不同的值。问题:1.程序设计的过程繁琐,
2.源程序代码冗余。解决方法:若把求绝对值编制成独立的程序段,当求绝对值时,就将控制转向它,执行后,将绝对值送回使用它的程序。一.子程序的引出S=︱X︱+︱Y︱+︱Z︱#子程序设计是模块化程序设计的基本技术
适用情况:1.当程序中有多处相同功能的程序段时,这个程序段就可以设计成子程序。2.当解决复杂问题时,把复杂问题分解成若干简单的子问题,每个子问题设计成子程序。二.相关概念子程序或过程:可被其它程序使用的独立程序段, 称为子程序或过程。主程序或调用程序:使用它的程序。4.6.1#
三.使用子程序的好处:
1.简化程序设计的过程,减少工作量,节省时间;
2.源程序缩短,从而节省汇编时间和存储目标码的 存储空间;
3.增强源程序的可读性,便于调试和维护;
4.有利于程序模块化、结构化,符合自顶向下的程 序设计思想;
5.编制好的子程序,可供其它开发软件调用。
4.6.1#四.子程序设计时,需要考虑的问题
1.子程序的定义若编制的程序具有相对独立的功能并在汇编后,可以被其他主程序调用,则这一过程称为子程序的定义。4.6.1#四.子程序设计时,需要考虑的问题
1.子程序的定义
2.主程序与子程序之间的调用与返回
MAIN 主程序 : :
调用A1子程序
: :
HLT
A1子程序开始 : :
: : 返回主程序
A1子程序结束4.6.1#四.子程序设计时,需要考虑的问题
1.子程序的定义
2.主程序与子程序之间的调用与返回
3.主程序与子程序之间的参数传递
MAIN 主程序 : : 入口参数 调用A1子程序 出口参数 : :
HLT
A1子程序开始 : :
: : 返回主程序
A1子程序结束4.6.1#四.子程序设计时,需要考虑的问题
1.子程序的定义
2.主程序与子程序之间的调用与返回
3.主程序与子程序之间的参数传递
4.保护现场与恢复现场
4.6.1 MAIN 主程序 : : 入口参数 调用A1子程序 出口参数 : :
HLT#
A1子程序开始 保护现场 :
: 恢复现场 返回主程序
A1子程序结束4.6子程序设计4.6.1子程序概述4.6.2子程序(过程)定义伪指令4.6.3子程序调用与返回指令4.6.4
子程序设计方法4.6.5
子程序设计举例
子程序定义伪指令有两条:PROC和ENDP一般格式:
PN PROC NEAR/[FAR] ;说明过程开始 过程名近的远的
: ;过程体
RET PN
ENDP
;说明过程结束说明:近—这个子程序只能被与它处于同一个代码段的主程序调用
远—这个子程序可以被与它处于不同代码段的主程序调用4.6.2子程序(过程)定义伪指令#例在代码段CSEG段中定义两个子程序SUB1和SUB2
CSEG SEGMENT
:
SUB1 PROC NEAR
: :
SUB1 ENDP
SUB2 PROC FAR
: :
SUB2 ENDP CSEG ENDS END4.6.2#4.6.3子程序调用与返回指令 MAIN 主程序 : :
调用 A1
断点 : :
HLT
子程序
A1PROC
: :
: : 返回
A1 ENDP 调用:保护断点
把子程序的入口地址CS、
IP返回:
将保存的断点处值送入CS、IP是CS、IP全保护,还只保护IP?
如何获取入口地址?一.调用的分类
1.按主程序与子程序是否在同一个代码段段内调用----近调用
段间调用----远调用段内调用是指在调用和返回过程中,转返地址不涉及
CS的变化,只通过
IP
内容的变化实现控制的转返。
段间调用是指在调用和返回过程中,转返地址需要
CS的变化,由CS和IP
的变化共同决定控制的转返。4.6.3#一.调用的分类
2.按子程序入口地址是直接还是间接给出
直接调用 间接调用
直接调用即在调用指令里,直接给出子程序名或入口地址的标号。
间接调用是在调用指令中,通过某寄存器或某存储单元指出子程序的入口地址。4.6.3#二.调用指令
格式:CALLPROC_NAME ;直接调用
操作:
1.当被调用子程序为近过程时:
(1)保护断点,即把当前指令指针IP的内容压入堆栈
SP←SP–2
(SP+1,SP)←IP
(2)把子程序的入口地址送入IP
IP←OFFSETPROC_NAME
4.6.3#
2.当被调用子程序为远过程时:
(1)保护断点,将
CS内容和IP
的内容压栈
SP←SP–2
(SP+1,SP)←CSSP←SP–2
(SP+1,SP)←IP(2)把子程序所在的段基址送入
CS,其所处的偏移地址送入
IP:
CS←SEGPROC_NAME IP←OFFSETPROC_NAMESPSP-2CSIPSP-24.6.3#
三.返回指令
格式:RET
操作:断点送入CS、IP1.段内返回
IP←(SP+1,SP)
SP←SP+22.段间返回
IP←(SP+1,SP)
SP←SP+2
CS←(SP+1,SP)
SP←SP+2
4.6.3#4.6.4子程序设计方法 MAIN 主程序 : : 入口参数
CALL A1
出口参数 : :
HLT
子程序
A1PROC
: :
: :
RET A1 ENDP 一.主程序与子程序之间的参数传递
入口参数:主程序调用子程序时,传送给子程序的需要 处理的数据。出口参数:子程序运行完后,传送给主程序的结果。#约定寄存器法约定存储单元法堆栈法约定参数地址指针法参数传递的方法#
1.约定寄存器法(适用参数少的情况)
即主程序和子程序之间,事先约定一些存放参数的通用寄存器,将子程序的入口和出口参数放到事先约定好的寄存器中。4.6.4#
2.约定参数地址指针法(适用参数多的情况)当要传递的参数较多时,采用约定地址指针法,即主程序将入口参数存放的地址送入约定的地址指针,然后调用子程序,子程序从地址指针指出的地址取出所需参数。当出口参数较多时,可存入内存某区域,然后把其首地址指针放入约定的寄存器中,供主程序使用。二.现场的保护与恢复
现场:即某些寄存器的值和所需的标志位的值。
方法:可利用堆栈来实现。
说明:可在主程序中完成,也可在子程序中完成。为保持主程序和子程序之间的相对独立性,若在主程序中保护现场,则一定在主程序中恢复现场。
例子:保护现场PUSHAX
恢复现场POPAX
4.6.4#
子程序
A1PROC
PUSHAX PUSHBXPUSHCX;保护现场
: : :
POPCX POPBX POPAX;恢复现场
RET A1 ENDP
#一.子程序设计的步骤1.确定功能界面功能界面:即是主程序和子程序各自完成什么功能。2.确定参数界面参数界面:即分析有哪些入口参数?哪些出口参数?进而确定合适的参数传递方法。3.编制子程序说明文件4.分别设计主程序和子程序,并进行调试。4.6.5子程序设计举例#二.子程序说明文件作用:使子程序便于阅读、维护和使用。包含内容:1.子程序名:子程序入口地址。2.子程序功能:子程序要完成的任务。3.入口参数:主程序提供给子程序的入口参数 (包括参数个数及存放位置)。4.出口参数:子程序提供给主程序的运行结果, 即出口参数(包括参数个数及存放位置)5.使用寄存器:说明子程序运行后,有哪些寄存器的内容 被破坏?
4.6.5#
例1编制程序计算:设X、Y为小于20000的无符号字数据,计算结果存入Z单元。分析:1.功能:设计一个子程序和一个主程序子程序求双字节整数的平方根的整数部分,主程序完成将三次开方的平方根相加。
2.入口参数:被开方数放在DX中,
出口参数:平方根放在DX中。三.程序举例约定寄存器法4.6.5
(1)子程序名:
SQROOT1;(2)子程序功能:求双字节整数的平方根的整数部分;(3)入口参数:被开方数在DX中;(4)出口参数:平方根在DX中;(5)使用的寄存器:BX,CX,DX及标志寄存器F。3.子程序说明文件4.6.5#规律:从1开始连续i个奇数之和是i的平方值N。i=5;1+3+5+7+9=25
;N=25i=6;1+3+5+7+9+11=36;N=36结论:整数N的平方根可以通过从N中依次减去1,3,5…
的连续奇数,所够减的次数i即是该数平方根。例如,25-1=2424-3=2121-5=1616-7=99-9=0一共减了5次,则5就是25的平方根。
DX:N;BX:奇数;CX:次数4.6.54.子程序算法分析#SUBDX,BXADDBX,2结束循环两个条件:正好减为0和不够减
SQROOT1PROC NEAR
;子程序开始
MOV BX,1 ;形成奇数,初始值为
XOR CX,CX ;减奇数个数寄存器清0SQRT1: SUB DX,BX AND DX,DX JZ SQRT2 JS SQRT3 INC CX ADD BX,2 JMP SQRT1 SQRT2:
INC CX
SQRT3:MOV DX,CX ;存平方根
RET ;返回
SQROOT1ENDP
;子程序结束
4.6.5子程序代码DSEG SEGMENTX DW 12345Y DW 2469Z DW ?DSEG ENDSCSEG SEGMENT
: :
MOV DX,X ADD DX,DX
CALL SQROOT1
PUSH DX
MOV DX,Y MOV AX,DX ADD DX,DX ADD DX,AX
CALL SQROOT1
PUSH DXMOV
DX,150
CALL SQROOT1
POP AX ADD AX,DX
POPDXADD AX,DX MOV Z,AX MOVAH,4CHINT21HSQROOT1PROC NEAR
::
RET SQROOT1ENDP
CSEG ENDSENDSTART4.6.5主要程序代码#例2 编制程序完成分别统计三组字数据中正数的个数。已知这三 组字数据分别存放在内存S1、S2、S3开始的单元,每组字数 据的长度分别存放在内存L1、L2、L3字变量,要求将统计 的结果分别存放在内存N1、N2、N3字变量。分析:1.功能:设计一个子程序和一个主程序子程序完成对一组字数据中正数个数的统计,主程序完成调用子程序并将统计结果存入指定变量。
2.入口参数:每组字数据首地址放在SI中,数据长度放在CX。
出口参数:正数个数放在AX中。约定参数地址指针法4.6.5#三.程序举例
(1)子程序名:
PCOUNT;(2)子程序功能:统计一组字数据中正数个数;(3)入口参数:每组字数据首地址放在SI中, 数据长度放在CX中;(4)出口参数:正数个数放在AX中;(5)使用的寄存器:
AX,CX,SI,DX及标志 寄存器F。3.子程序说明文件4.6.5#PCOUNTPROC NEAR
;子程序开始
XOR AX,AX CONT: MOV DX,[SI] AND DX,DX JS NEXT INC AX NEXT: ADD SI,2 LOOP CONT RET ;返回PCOUNT
ENDP
;子程序结束
4.6.5子程序代码#DSEG SEGMENTS1 DW -1,2,45,-3, S2 DW -21,34,20, S3 DW -98,1234,-300L1 DW 2000L2 DW 500L3 DW 1000N1 DW?N2 DW?N3 DW?DSEG ENDSCSEG SEGMENT
: :
LEA SI,S1 MOV CX,L1
CALL PCOUNT
MOVN1,AX
LEASI,S2 MOVCX,L2
CALLPCOUNT
MOVN2,AX
LEASI,S3 MOVCX,L3
CALLPCOUNT
MOVN3,AXMOVAH,4CHINT21HPCOUNTPROC NEAR
::
RET PCOUNTENDP
CSEG ENDS
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 课题申报参考:近代日本对中国茶业的侵夺研究
- 课题申报参考:教育高质量发展视域下大学体育一流本科课程建设实证研究
- 2025年园林景观绿化地使用权转让合同4篇
- 2025年度新能源汽车充电站车位租赁合作协议书4篇
- 2025版委托担保合同范本:知识产权质押贷款担保合同3篇
- 2025年度家具行业绿色供应链管理合同4篇
- 二零二五版桥梁建设施工合作协议2篇
- 2025年度个人沿街店房租赁合同(含合同解除条件与争议解决)4篇
- 二零二五年度国际交流项目教师选拔与聘用协议
- 2025年度星级酒店厨房设备采购与定期检修合同4篇
- 数学-山东省2025年1月济南市高三期末学习质量检测济南期末试题和答案
- 中储粮黑龙江分公司社招2025年学习资料
- 湖南省长沙市2024-2025学年高一数学上学期期末考试试卷
- 船舶行业维修保养合同
- 2024年林地使用权转让协议书
- 数字的秘密生活:最有趣的50个数学故事
- 移动商务内容运营(吴洪贵)任务一 移动商务内容运营关键要素分解
- 基于ADAMS的汽车悬架系统建模与优化
- 当前中国个人极端暴力犯罪个案研究
- 中国象棋比赛规则
- GB/T 31525-2015图形标志电动汽车充换电设施标志
评论
0/150
提交评论