汇编语言程序设计第9章子程序设计.ppt_第1页
汇编语言程序设计第9章子程序设计.ppt_第2页
汇编语言程序设计第9章子程序设计.ppt_第3页
汇编语言程序设计第9章子程序设计.ppt_第4页
汇编语言程序设计第9章子程序设计.ppt_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

2020 2 12 第9章子程序的设计 1 8086 8088和ARM核汇编语言程序设计 第9章子程序设计 教学重点 子程序设计方法 2020 2 12 第9章子程序的设计 2 9 2子程序的参数传递 9 3子程序嵌套与递归 第9章子程序设计 9 1子程序设计方法 9 4子程序库 2020 2 12 第9章子程序的设计 3 子程序又称为过程 是能完成特定功能有一定通用性的程序段 在需要时能被其它程序调用 调用子程序的程序常称为主程序 一般把源程序中反复出现的程序段或常用的功能独立的程序段设计成子程序供用户使用 这样可以简化源程序结构 节省目标程序的存储空间 提高程序设计的效率 子程序结构也是模块化程序设计的基础 本章主要介绍子程序的定义 子程序调用和返回 子程序的参数传递以及子程序库等知识 9 1子程序设计方法 2020 2 12 第9章子程序的设计 4 9 1子程序设计方法 9 1 1子程序的定义 子程序的定义是由过程定义伪指令PROC和ENDP实现 格式如下 过程名PROC NEAR FAR 过程体过程名ENDP NEAR属性的过程只能被相同代码段的其他程序调用 FAR属性的过程可以被不同代码段的程序调用 1 子程序和主程序在同一个代码段中 则子程序定义为NEAR属性 2 子程序和主程序不在同一个代码段中 则子程序定义为FAR属性 3 主程序通常定义为FAR属性 这是因为主程序被看作DOS调用的一个子程序 以便执行完返回DOS 2020 2 12 第9章子程序的设计 5 9 1子程序设计方法 9 1 1子程序的定义 子程序可以放在代码段主程序开始执行之前的位置 也可放在代码段的末尾主程序执行终止后的位置 为了便于其他程序员能正确使用子程序 在编写子程序时 还要养成书写子程序说明信息的良好习惯 子程序说明信息一般包括以下内容 1 子程序名 2 功能描述 3 入口和出口参数 4 调用注意事项和说明等 2020 2 12 第9章子程序的设计 6 9 1子程序设计方法 9 1 1子程序的定义 例9 1编写一个子程序 从键盘输入一位十进制数 子程序名 stdin 功能 完成从键盘输入一位十进制数 入口参数 等待键盘输入 出口参数 al中存放输入的数值stdinprocmovah 1int21hcmpal 30hjlnextcmpal 39hjgnextandal 0fhnext retstdinendp 2020 2 12 第9章子程序的设计 7 9 1子程序设计方法 9 1 2子程序调用与返回 子程序调用与返回由CALL和RET指令实现 子程序调用指令首先把子程序的返回地址 即CALL指令的下一条指令的地址 压入堆栈 然后转移到子程序的入口地址执行子程序 根据子程序和主程序是否在同一代码段 分为段内调用和段间调用 子程序和主程序在同一个代码段中称为段内调用 子程序和主程序不在同一个代码段中 称为段间调用 子程序返回指令负责把压入栈区的返回地址弹出送IP或CS IP 实现返回主程序继续往下执行 与子程序的段内调用和段间调用相对应 子程序的返回也分为段内返回和段间返回 2020 2 12 第9章子程序的设计 8 9 1子程序设计方法 9 1 2子程序调用与返回 当子程序和主程序在同一个代码段中 子程序的定义和调用如下图 codesegmentmainprocfar callsuba retmainendpsubaprocnear retsubaendpcodeends 2020 2 12 第9章子程序的设计 9 9 1子程序设计方法 9 1 2子程序调用与返回 当子程序和主程序不在同一个代码段中 子程序的定义和调用如下图 code1segmentmainprocfar callfarptrsuba retmainendpcode1endscode2segmentsubaprocfar retsubaendpcode2ends 2020 2 12 第9章子程序的设计 10 9 1子程序设计方法 9 1 3寄存器内容的保护与恢复 通常主程序和子程序是分别编制的 所以它们可能会使用同一个寄存器 如果主程序中某个寄存器的内容在调用子程序后还要用 而子程序又恰好使用了同一个寄存器 当子程序修改了寄存器的内容后 返回到主程序时 该寄存器的内容也就不会是调用子程序前的内容 这样 常常会导致调用程序的出错 为此 编写子程序时 在一进入子程序后 就把它所用到的寄存器内容压进栈 在返回前 再把它们弹出栈 为什么寄存器的保护与恢复 2020 2 12 第9章子程序的设计 11 9 1子程序设计方法 9 1 3寄存器内容的保护与恢复 例如 若子程序PROG中改变了寄存器AX BX CX DX的值 则可采用如下方法保护和恢复现场 PROGPROCPUSHAXPUSHBXPUSHCX 保护现场PUSHDX POPDXPOPCXPOPBX 恢复现场POPAXRET 返回断点处PROCENDP 注意 堆栈 先进后出 的操作特点 恢复寄存器的顺序不能搞错 2020 2 12 第9章子程序的设计 12 9 2子程序的参数传递 9 2 1用寄存器传递参数 优点 直接 简便 只要把参数存放在约定的寄存器中就行了 缺点 适用于传递参数较少的情况 例9 3从键盘输入一组字符 直到 0 为止 编一子程序 完成当输入是小写字母时 则修改为大写字母 输入的字符存放在string为首址的存储单元中 参数可以增加子程序的灵活性和通用性 调用程序传送给子程序的参数称为入口参数 子程序返回给调用程序的结果称为出口参数 2020 2 12 第9章子程序的设计 13 9 2子程序的参数传递 9 2 1用寄存器传递参数 主程序Datasegmentstringdb100dup dataendscodesegmentassumecs code ds datastart movax datamovds axmovdi offsetstringagain movah 1int21hcmpal 0 jeexitcallstobmov di alincdijmpagainexit movah 4chint21h 子程序名 stob 功能 将小写字母修改为大写字母 入口参数 al存放输入的字符 出口参数 al存放修改后的字符stobprocnearcmpal 61hjbnextcmpal 7ahjanextsubal 20hnext retstobendpcodeendsendstart 2020 2 12 第9章子程序的设计 14 9 2子程序的参数传递 9 2 2用存储单元传递参数 这种方法是使用存储单元传递参数的 即主程序在存储单元建立一个参数表 存放子程序所要的参数 在主程序中将该参数表首地址传送给子程序 子程序通过参数表取得所需参数 并把结果也存放到指定存储单元中 优点 适合于传递参数较多的情况 第十六讲 2020 2 12 第9章子程序的设计 15 9 2子程序的参数传递 9 2 2用存储单元传递参数 例9 4使用存储单元传递参数的方法来实现例9 3 主程序datasegmentstringdb100dup Lentdw dataendscodesegmentassumecs code ds datamainprocfarstart pushdsmovax 0pushaxmovax datamovds axmovcx 0movdi offsetstringagain movah 1int21hcmpal 0 jenext mov di alincdiinccxjmpagainnext movlent cxleabx stringcallstob1ret 2020 2 12 第9章子程序的设计 16 9 2子程序的参数传递 9 2 2用存储单元传递参数 子程序名 stob1 功能 将小写字母修改为大写字母 入口参数 bx存放数据存储单元首址 出口参数 修改后的字符存回原存储单元中stob1procmovcx lentagain1 moval bx cmpal 61hjbnext1cmpal 7ahjanext1subal 20hmov bx alnext1 incbxdeccxjnzagain1retstob1endpmainendpcodeendsendstart 2020 2 12 第9章子程序的设计 17 9 2子程序的参数传递 9 2 3用堆栈传递参数 用堆栈传递入口参数时 要在调用子程序前把有关参数依次压栈 子程序从堆栈中取得入口参数 用堆栈传递出口参数时 要在子程序返回前 把有关参数依次压栈 主程序就可以从堆栈中取到出口参数 优点 适合于传递参数较多的情况 注意 避免因堆栈操作而造成子程序不能正确返回的错误 2020 2 12 第9章子程序的设计 18 9 2子程序的参数传递 9 2 3用堆栈传递参数 例9 5编一子程序 求有符号字数组array中元素的最小值 数组元素的个数存放在cont字单元中 Datasegmentarraydw100 66 1 88 20contdw5mindw dataendsstacksegmentdw128dup stackendscodesegmentassumecs code ds data ss stackstart movax datamovds axmovax offsetarraypushax 数组偏移地址进栈movax contpushax 元素个数进栈callfindminmovmin ax 保存出口参数movah 4chint21h 2020 2 12 第9章子程序的设计 19 9 2子程序的参数传递 9 2 3用堆栈传递参数 子程序名 findmin 功能 求有符号字数组中元素的最小值 入口参数 数组首地址和元素个数在堆栈中 出口参数 ax中存放最小值findminprocpushbpmovbp sp 为取参数作准备pushbxpushcxmovbx bp 6 从堆栈中取数组首地址送bxmovcx bp 4 从堆栈中取元素个数送cxdeccxmovax bx 取出第一个元素给AXagain addbx 2cmp bx ax 与下一个数据比较jgnextmovax bx next loopagainpopcxpopbxpopbpret fminendpcodeendsendstart 2020 2 12 第9章子程序的设计 20 9 3子程序嵌套与递归 一个子程序也可以作为调用程序去调用另一个子程序 称为子程序嵌套 递归子程序 如果一个子程序调用的是子程序的本身 就是递归子程序 例9 6编程计算n 设0 n 6 分析 求n 的递归定义为 2020 2 12 第9章子程序的设计 21 9 3子程序嵌套与递归 DatasegmentNumdb3Resultdw DataendsStacksegmentparastack stack db100dup StackendsCodesegmentassumecs code ds data ss stackMainprocfarBegin pushdsxorax axpushaxmovax datamovds ax 2020 2 12 第9章子程序的设计 22 9 3子程序嵌套与递归 movah 0moval numcallfactormovresult axretMainendp Factorprocpushaxsubax 1jnef contpopaxjmpreturnf cont callfactorpopcxmulclreturn retfactorendpCodeendsendbegin IP1 Movresult ax地址 3 IP2 Popcx地址 2 IP3 Popcx地址 1 ax 1 IPPOPCX地址 cx 2 ax cx 1 2 IPPOPCX地址 cx 3 ax cx 1 2 3 IPMovresult ax地址 2020 2 12 第9章子程序的设计 23 9 4子程序库 开发大型应用程序时 通常把复杂的程序分成很多功能独立的模块 分别编写成子程序 对各个子程序模块单独进行汇编产生相应的目标模块 OBJ文件 最后再用连接程序把它们连接起来 形成一个完整的可执行程序 采用这种模块化程序设计方法 程序不但结构清晰 也便于调试 采用模块化程序设计 各模块之间会存在着相互调用 即一个模块会引用在另一个模块中定义的标识符 包括变量 标号 过程名等 标识符有两种 1 在本模块中定义 供本模块使用的标识符称为局部标识符 2 在一个模块中定义 而又在另一个模块中引用的标识符称为外部标识符 2020 2 12 第9章子程序的设计 24 9 4子程序库 为了解决各模块间标识符的交叉访问 汇编语言提供了二条伪指令PUBLIC和EXTRN 1 伪指令PUBLIC说明 当前模块中哪些标识符是能被其它模块引用的外部标识符 其格式如下 PUBLIC标识符 标识符 定义标识符的模块使用 2 伪指令EXTRN说明 在当前模块所使用的标识符中 哪些标识符是已在其它模块中被定义为指定类型的标识符 格式如下 EXTRN标识符 类型 标识符 类型 调用标识符的模块使用 2020 2 12 第9章子程序的设计 25 9 4子程序库 例9 7从键盘输入一个数n 0 n 6 求n 并输出结果 把例9 1 例9 2例和9 6的子程序编写成子程序模块 供主程序调用 子程序stdin asmpublicstdincodesegmentstdinprocfar 例9 1中的输入子程序stdin stdinendpcodeendsend 子程序dispax asmpublicdispaxdatasegmentdb4dup 0ah 0dh dataendscodesegmentdispaxprocfar 例9 2

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论