




已阅读5页,还剩16页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
子程序设计子程序又称过程过程的定义和调用过程的定义ProcedurenamePROCattribute RETProcedurenameENDP过程名 Procedurename 是标识符过程的调用CALL指令直接寻址方式间接寻址方式段内调用段间调用 当过程和主程序在同一代码段时 过程定义和调用的格式如下 CSEGSEGMENTMAINPROCFAR CALLSUBT RETMAINENDPSUBTPROCNEAR RETSUBTENDPCSEGENDS 当过程和主程序不在一个代码段时 则过程的定义和调用格式如下 XSEGSEGMENTSUBT1PROCFAR RETSUBT1ENDP CALLSUBT1XSEGENDSYSEGSEGMENT CALLSUBT1YSEGENDS 寄存器内容的保护和恢复SUBRPPROCFARPUSHAXPUSHBXPUSHCXPUSHDX POPDXPOPCXPOPBXPOPAXRETSUBPRENDP 主程序和过程间的参数传送用CPU内部的寄存器传送参数例 将4位十六进制ASCII码转换为等值二进制数 已知4位十六进制ASCII码存放在内存的某一区城中 且低位数的地址号低 而高位数的地址号高 将4位十六进制ASCII码转换为等值二进制数的过程为 从最低位ASCII码开始 逐位将一个字节的ASCII码转换为等值二进制数 最后将它们拼装起来即可 入口参数 存放4位十六进制ASCII码的内存首地址送入DS SI ASCII码的位数4存放在CL中 出口参数 转换结果 等值二进制数 存放在DX中 CSEGSEGMENTASSUMECS CSEGASC BINPROCFARPUSHAX 保护寄存器内容 MOVCH CL 位数送CH CLD 方向标志清零 XORAX AX AX及DX 清零 MOVDX AXAGAIN LODSB DS SI AL SI 1 SI ANDAL 7FH 设置标志位 CMPAL 9 判该位ASCII码是否大于39H JGA TO FSUBAL 30HJMPSHORTROTATEA TO F SUBAL 37HROTATE ORDL AL 拼装各位转换结果 RORDX CLDECCHJNZAGAINPOPAXRETASC BINENDPCSEGENDS 调用程序 STACKSEGMENTDW256DUP TOPLABELWORDSTACKENDSDATASEGMENTASC STGDB4DUP BIN RESULTDW DATAENDSXSEGSEGMENTASSUMECS XSEG DS DATA SS STACKMAINPROCFARMOVAX STACKMOVSS AXMOVSP OFFSETTOPSTART PUSHDSSUBAX AXPUSHAXMOVAX DATAMOVDS AXMOVSI OFFSETASC STGMOVCL 4CALLASC BINMOVBIN RESULT DX RETMAINENDPXSEGENDSENDSTART 指定内存单元 变量 传递参数 例 在某一程序中 若需对N元素的数组求和 便可设计一个属性为NEAR的过程 它用来完成数组N个元素的求和 过程如下 PROADDPROCNEARPUSHAXPUSHCXPUSHDXPUSHSILEASI ARYMOVCX COUNTXORAX AXMOVDX AXAGAIN ADDAX SI 累加N个元素的低位字 JNCNEXTINCDX 若有进位 则和的高位字加1 NEXT ADDSI 2LOOPAGAINMOVSUM AXMOVSUM 2 DXPOPSIPOPDXPOPCXPOPAXRETPROADDENDS CSEGENDP 主程序如下 DSEGSEGMENTARYDW100DUP COUNTDW SUMDW2DUP DSEGENDSSSEGSEGMENTSTACKDB100DUP TOPLEBELWORDSSEGENDSCSEGSEGMENT CALLPROADD 通过地址表传送变量地址以数组元素求和为例 过程定义如下 PROADDPROCNEARPUSHAXPUSHDXPUSHCXPUSHSIPUSHDIMOVSI BX 取数组地址 MOVDI BX 2 取元素个数 并送入CX MOVCX DI MOVDI BX 4 取和数地址 XORAX AXMOVDX AXNEXT ADDAX SI JNCNO CARRYINCDX NO CARRY ADDSI 2LOOPNEXTMOV DI AXMOV DI 2 DXPOPDIPOPSIPOPCXPOPDXPOPAXRETPROADDENDP 主程序如下 DSEGSEGMENTARY1DW100DUP COUNT1DW SUM1DW2DUP NUMDW100DUP NDW TOTALDW2DUP TABLEDW3DUP DSEGENDSSTACKSEGMENTSTACKDB100DUP TOPLABELWORDSTACKENDSCSEGSEGMENT MOVAX DSEGMOVDS AX MOVTABLE OFFSETARY1 装填地址表 MOVTABLE 2 OFFSETCOUNT1MOVTABLE 4 OFFSETSUM1MOVBX OFFSETTABLE 表地址存入BX CALLNEARPTRPROADD 求数组ARY1的和 MOVTABLE OFFSETNUM 重新建立地址表 MOVTABLE 2 OFFSETNMOVTABLE 4 OFFSETTOTALLEABX TABLECALLNEARPTRPROADD 求数组NUM的和 CSEGENDS 用堆栈传送参数过程定义如下 PROADDPROCNEARPUSHBPMOVBP SP 采用BP访问参数地址 PUSHAXPUSHDXPUSHCXPUSHSIPUSHDIMOVSI BP 8 取数组地址 MOVDI BP 6 取计数值地址 MOVCX DI 计数值送CX MOVDI BP 4 和数地址送DI XORAX AX AX及DX清零 MOVDX AXNEXT ADDAX SI JNCNO CARRYINCDX NO CARRY ADDSI 2LOOPNEXTMOV DI AXMOV DI 2 DXPOPDIPOPSIPOPCXPOPDXPOPAXPOPBPRET6PROADDENDP 主程序如下 CSEGSEGMENTMOVBX OFFSETARY1 参数地址压入堆栈 PUSHBXMOVBX OFFSETCOUNT1PUSHBXMOVBX OFFSETSUM1PUSHBXCALLNEARPTRPROADD MOVBX OFFSETNUM 参数地址压入堆栈 PUSHBXMOVBX OFFSETNPUSHBXMOVBX OFFSETTOTALPUSHBXCALLNEARPTRPROADDCSEGENDS 过程的嵌套 递归调用和可重入性例 实现N N 0 N N N 1 N 2 1N N N 1 N 0N 0 1N 0设阶乘子程序为FACT N 则求N阶乘的过程为N FACT N N FACT N 1 N N 1 FACT N 2 N N 1 N 2 FACT 0 DATASEGMENT 定义数据段 VAL NDW RESULTDW DATAENDSSTACKSEGMENT 定义堆栈段 DW128DUP 0 TOPLABELWORDSTACKENDSCODE1SEGMENTMAINPROCFARASSUMECS CODE1 DS DATA SS STACKSTART MOVAX STACK 设置SS及SP MOVSS AXMOVSP OFFSETTOPPUSHDS 将PSP中INT20H的首址压入堆栈SUBAX AXPUSHAXMOVAX DATAMOVDS AXMOVBX OFFSETRESULT 将运算结果的地址压入栈 PUSHBXMOVBX VAL N 将参量N压入栈PUSHBXCALLFARPTRFACT 递归调用FACT子程序 RETMAINENDPCODE1ENDS CODESEGMENTFRAMESTRUC 定义结构数据模式 SAVE BPDW SAVE CS IPDW2DUP NDW RESULT ADDRDW FRAMEENDSASSUMECS CODEFACTPROCFAR PUSHBP 存BP MOVBP SP BP作为帧指针 PUSHBX 保护寄存器内容 PUSHAXMOVBX BP RESULT ADDR 结果地址送BXMOVAX BP N 取NCMPAX 0 N 0 JEDONEPUSHBX 下一次的结果地址入栈 DECAX N 1压入栈 PUSHAXCALLFARPTRFACTMOVBX BP RESULT ADDR 结果地址送BX MOVAX BX 上次的结果取入AX MUL BP N AX N RESULTJMPSHORTRETURNDONE MOVAX 1 0 1 RETURN MOV BX AX 存最终结果 POPAXPOPBXPOPBPRET4FACTENDPCODEENDSENDSTART 多模块程序设计优点 适合集体分工合作已编好的程序模块可被直接利用维修和更改功能很方便 多模块的连接模块1DSEGSEGMENTCOMMONDW50DUP DSEGENDCODESEGMENTPUBLIC CODEENDS 模块2DSEGSEGMENTCOMMONDW40DUP DSEGENDCODESEGMENTPUBLIC CODEENDS 组合类型为COMMON和PUBLIC时的连接结果 模块1的数据段 模块2的数据段 模块2的代码段 模块1的数据段 模块间标识符的交叉访问模块1EXTRNFIRST BYTE ADDITION FAREXTRNSECOND WORD SUBTRACT NEARPUBLICTABLE DATADSEGSEGMENTPUBLIC DSEG TABLEDB100DUP DATADW DSEGENDSCODESEGMENTPUBLIC CODE ASSUMECS CODE DS DSEG MOVAX DSEGMOVDS AX MOVAL FIRST FIRST的段地址在DS中 MOVAX SEGSECOND SECOND的段地址在ES中 MOVES AXMOVBX ES SECOND CODEENDSEND 模块2EXTRNTABLE BYTE THIRD WORDPUBLICSUBTRACT FIRSTDSEGSEGMENTPUBLIC DSEG FIRSTDB DSEGENDSCODESEGMENTPUBLIC CODE SUBTRACT CODEENDSEND 模块3EXTRNDATA WORDPUBLICADDITION SECOND SUMDSEG1SEGMENTSECONDDW SUMDW DSEG1ENDSCSEGSEGMENT ADDITNION CSEGENDSEND 多模块程序的设计模块化程序设计的步骤如下 1 正确地描述整个程序需要完成什么样的工作 2
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 水龙吟苏轼次韵课件
- 水粉画讲解课件
- 海上光伏项目海洋环境监测与保护方案
- 消防设施区域划分与标识方案
- 市政管道施工地下水控制方案
- 医院药品采购与供应药品采购管理36课件
- 遮风避雨35景观建筑设施及小品设计18课件
- 二零二五版电动摩托车租赁与人才培训合同
- 二零二五年度文化活动策划劳务承包协议
- 二零二五年度房地产网络营销代理服务合同范本
- 2023年宁波市慈溪市人民法院招聘编外人员考试真题及答案
- 高速公路服务区升级转型商业计划书
- 数学原来这么有趣
- 常见行政案件笔录模版
- 手术室甲状腺切除术手术配合护理查房
- 国家电网电力中级职称考试题
- 数据库设计规范说明
- 建设工程消防验收评定规则
- 肾内科临床技术操作规范2022版
- 2023年中国工商银行软件开发中心春季校园招聘500人笔试模拟试题及答案解析
- 地质勘查钻探岩矿心管理通则
评论
0/150
提交评论