安徽理工大学计算机汇编教程-子程序设计.ppt_第1页
安徽理工大学计算机汇编教程-子程序设计.ppt_第2页
安徽理工大学计算机汇编教程-子程序设计.ppt_第3页
安徽理工大学计算机汇编教程-子程序设计.ppt_第4页
安徽理工大学计算机汇编教程-子程序设计.ppt_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

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

文档简介

计算机科学与技术系 汇编语言程序设计汇编语言程序设计 8086/8088和ARM核 汇编语言程序设计 第第9 9章章 子程序设计子程序设计 Date 1 第1章 汇编语言基础知识 9 章 子程序的设计 计算机科学与技术系 汇编语言程序设计汇编语言程序设计 9.2 子程序的参数传递 9.3 子程序嵌套与递归 第第9 9章章 子程序设计子程序设计 9.1 子程序设计方法 9.4 子程序库 Date 2 第1章 汇编语言基础知识 9 章 子程序的设计 计算机科学与技术系 汇编语言程序设计汇编语言程序设计 子程序又称为过程,是能完成特定功能有一定通用性的 程序段,在需要时能被其它程序调用。调用子程序的程序常 称为主程序。一般把源程序中反复出现的程序段或常用的功 能独立的程序段设计成子程序供用户使用。 这样可以简化源程序结构、节省目标程序的存储空间, 提高程序设计的效率。子程序结构也是模块化程序设计的基 础。本章主要介绍子程序的定义、子程序调用和返回、子程 序的参数传递以及子程序库等知识。 9.1 9.1 子程序设计方法子程序设计方法 Date 3 第1章 汇编语言基础知识 9 章 子程序的设计 计算机科学与技术系 汇编语言程序设计汇编语言程序设计 9.1 9.1 子程序设计方法子程序设计方法 9.1.1 子程序的定义 子程序的定义是由过程定义伪指令PROC和ENDP实现,格式如下: 过程名 PROCNEAR|FAR ;过程体 过程名 ENDP NEAR属性的过程只能被同一代码段的其他程序调用(段内调用),FAR属 性的过程可以被不同代码段的程序调用(段间调用)。 (1)子程序和调用程序在同一个代码段中,则子程序定义为NEAR属性。 (2)子程序和调用程序不在同一个代码段中,则子程序定义为FAR属性。 (3)主程序通常定义为FAR属性,这是因为主程序被看作DOS调用的一个子 程序,以便执行完返回DOS。 Date 4 第1章 汇编语言基础知识 9 章 子程序的设计 计算机科学与技术系 汇编语言程序设计汇编语言程序设计 9.1 9.1 子程序设计方法子程序设计方法 9.1.1 子程序的定义 子程序可以放在代码段主程序开始执行之前的位置,也可放在 代码段的末尾主程序执行终止后的位置。 为了便于其他程序员能正确使用子程序,在编写子程序 时,还要养成书写子程序说明信息的良好习惯。子程序说明 信息一般包括以下内容: (1)子程序名 (2)功能描述 (3)入口和出口参数 (4)调用注意事项和说明等 Date 5 第1章 汇编语言基础知识 9 章 子程序的设计 计算机科学与技术系 汇编语言程序设计汇编语言程序设计 9.1 9.1 子程序设计方法子程序设计方法 9.1.1 子程序的定义 例9.1 编写一个子程序,从键盘输入一位十进制数。 ;子程序名:stdin ;功能:完成从键盘输入一位十进制数 ;入口参数:等待键盘输入 ;出口参数:al中存放输入的数值 stdinproc movah,1 int21h cmpal,30h jl next cmp al,39h jg next and al,0fh next: ret stdin endp Date 6 第1章 汇编语言基础知识 9 章 子程序的设计 计算机科学与技术系 汇编语言程序设计汇编语言程序设计 9.1 9.1 子程序设计方法子程序设计方法 9.1.2 子程序调用与返回 子程序调用与返回由CALL和RET指令实现。 子程序调用指令首先把子程序的返回地址(即CALL指令的 下一条指令的地址)压入堆栈,然后转移到子程序的入口 地址执行子程序。 根据子程序和主程序是否在同一代码段,分为段内调用和 段间调用。 子程序和主程序在同一个代码段中称为段内调用; 子程序和主程序不在同一个代码段中,称为段间调用。 子程序返回指令负责把压入栈区的返回地址弹出送IP或 CSIP,实现返回主程序继续往下执行。子程序的返回也 分为段内返回和段间返回。 Date 7 第1章 汇编语言基础知识 9 章 子程序的设计 计算机科学与技术系 汇编语言程序设计汇编语言程序设计 子程序调用:隐含使用堆栈保存返回地址 call near ptr subp (1) 保存返回地址 (2) 转子程序 (IP) subp的偏移地址 call far ptr subp (1) 保存返回地址 (2) 转子程序 (CS) subp的段地址 (IP) subp的偏移地址 (IP)(SP) (IP)(SP) (CS) 子程序的调用和返回 Date 8 第1章 汇编语言基础知识 9 章 子程序的设计 计算机科学与技术系 汇编语言程序设计汇编语言程序设计 9.1 9.1 子程序设计方法子程序设计方法 9.1.2 子程序调用与返回 子程序调用与返回由CALL和RET指令实现。 子程序返回指令负责把压入栈区的返回地址弹出送IP或 CSIP,实现返回主程序继续往下执行。子程序的返回也 分为段内返回和段间返回。 Date 9 第1章 汇编语言基础知识 9 章 子程序的设计 计算机科学与技术系 汇编语言程序设计汇编语言程序设计 9.1 9.1 子程序设计方法子程序设计方法 9.1.2 子程序调用与返回 当子程序和主程序在同一个代码段中,子程序的定义和调用如下图: code segment main proc far call suba ret main endp suba proc near ret suba endp code ends code segment main proc far call subr1 ret subr1 proc near ret subr1 endp main endp code ends Date 10 第1章 汇编语言基础知识 9 章 子程序的设计 计算机科学与技术系 汇编语言程序设计汇编语言程序设计 9.1 9.1 子程序设计方法子程序设计方法 9.1.2 子程序调用与返回 当子程序和主程序不在同一个代码段中,子程序的定义和调用如下图: code1 segment main proc far call far ptr suba ret main endp code1 ends code2 segment suba proc far ret suba endp code2 ends Date 11 第1章 汇编语言基础知识 9 章 子程序的设计 计算机科学与技术系 汇编语言程序设计汇编语言程序设计 9.1 9.1 子程序设计方法子程序设计方法 9.1.3寄存器内容的保护与恢复 通常主程序和子程序是分别编制的,所以它们可能会使 用同一个寄存器。如果主程序中某个寄存器的内容在调用 子程序后还要用,而子程序又恰好使用了同一个寄存器, 当子程序修改了寄存器的内容后,返回到主程序时,该寄 存器的内容也就不会是调用子程序前的内容,这样,常常 会导致调用程序的出错。为此,编写子程序时,在一进入 子程序后,就把它所用到的寄存器内容压进栈,在返回前 ,再把它们弹出栈。 为什么寄存器的保护与恢复? Date 12 第1章 汇编语言基础知识 9 章 子程序的设计 计算机科学与技术系 汇编语言程序设计汇编语言程序设计 9.1 9.1 子程序设计方法子程序设计方法 9.1.3寄存器内容的保护与恢复 例如:若子程序例如:若子程序PROGPROG中改变了寄存器中改变了寄存器AXAX,BXBX,CXCX,DXDX的值,则的值,则 可采用如下方法保护和恢复现场。可采用如下方法保护和恢复现场。 PROGPROC PUSHPUSHAXAX PUSH PUSH BX BX PUSH PUSHCXCX;保护现场保护现场 PUSHPUSHDXDX POPPOPDXDX POPPOPCXCX POPPOPBXBX;恢复现场恢复现场 POPPOPAXAX RET;返回断点处 PROCENDP 注意:堆栈“先进后 出”的操作特点,恢 复寄存器的顺序不能 搞错 。 Date 13 第1章 汇编语言基础知识 9 章 子程序的设计 计算机科学与技术系 汇编语言程序设计汇编语言程序设计 9.2 9.2 子程序的参数传递子程序的参数传递 9.2.1用寄存器传递参数 优点:直接、简便,只要把参数存放在约定的寄存器中就行了。 缺点:适用于传递参数较少的情况。 例9.3从键盘输入一组字符,直到“0”为止。编一子程序,完 成当输入是小写字母时,则修改为大写字母。输入的字符存放 在string为首址的存储单元中。 调用程序传送给子程序的参数称为入口参数, 子程序返回给调用程序的结果称为出口参数。 Date 14 第1章 汇编语言基础知识 9 章 子程序的设计 计算机科学与技术系 汇编语言程序设计汇编语言程序设计 9.2.1用寄存器传递参数 ;主程序 datasegment string db 100 dup(?) data ends code segment assume cs:code,ds:data start: mov ax,data mov ds,ax mov di,offset string again:mov ah,1 int 21h cmp al,,0 je exit call stob mov di,al inc di jmp again exit: mov ah,4ch int 21h ;子程序名:stob ;功能:将小写字母修改为大写字母 ;入口参数:al存放输入的字符 ;出口参数:al存放修改后的字符 stob proc near cmp al,61h jb next cmp al,7ah ja next sub al,20h next:ret stob endp code ends end start Date 15 第1章 汇编语言基础知识 9 章 子程序的设计 计算机科学与技术系 汇编语言程序设计汇编语言程序设计 9.2 9.2 子程序的参数传递子程序的参数传递 9.2.2 用存储单元传递参数 这种方法是使用存储单元传递参数的,即主程序在 存储单元建立一个参数表,存放子程序所要的参数,在 主程序中将该参数表首地址传送给子程序,子程序通过 参数表取得所需参数,并把结果也存放到指定存储单元 中。 优点:适合于传递参数较多的情况。 Date 16 第1章 汇编语言基础知识 9 章 子程序的设计 计算机科学与技术系 汇编语言程序设计汇编语言程序设计 9.2 9.2 子程序的参数传递子程序的参数传递 9.2.2 用存储单元传递参数 例9.4使用存储单元传递参数的方法来实现例9.3。 ;主程序 datasegment string db100 dup(?) Lentdw? dataends codesegment assumecs:code,ds:data main proc far start::push ds mov ax,,0 push ax movax,data movds,ax movcx,0 movdi,offset string again:movah,1 int21h cmpal,0 jenext movdi,al incdi inccx jmpagain next: mov lent,cx leabx,string callstob1 ret Date 17 第1章 汇编语言基础知识 9 章 子程序的设计 计算机科学与技术系 汇编语言程序设计汇编语言程序设计 9.2 9.2 子程序的参数传递子程序的参数传递 9.2.2 用存储单元传递参数 ;子程序名:stob1 ;功能:将小写字母修改为大写字母 ;入口参数:bx存放数据存储单元首址 ;出口参数:修改后的字符存回原存储单元中 stob1proc movcx,lent again1: moval,bx cmpal,61h jbnext1 cmpal,7ah janext1 subal,20h movbx,al next1: incbx deccx jnzagain1 ret stob1endp mainendp codeends endstart Date 18 第1章 汇编语言基础知识 9 章 子程序的设计 计算机科学与技术系 汇编语言程序设计汇编语言程序设计 9.2 9.2 子程序的参数传递子程序的参数传递 9.2.3 用堆栈传递参数 用堆栈传递入口参数时,要在调用子程序前(在主程序中)把 有关参数依次压栈,子程序从堆栈中取得入口参数; 用堆栈传递出口参数时,要在子程序返回前,把有关参数依 次压栈,主程序就可以从堆栈中取到出口参数。 优点:适合于传递参数较多的情况。 注意:避免因堆栈操作而造成子程序不能正确返回的错误。 Date 19 第1章 汇编语言基础知识 9 章 子程序的设计 计算机科学与技术系 汇编语言程序设计汇编语言程序设计 9.2 9.2 子程序的参数传递子程序的参数传递 9.2.3 用堆栈传递参数 例9.5编一子程序:求有符号字数组array中元素的最小值。数组元素的个数 存放在cont字单元中。 Data segment array dw 100,66,-1,88,20 cont dw5 min dw ? data ends stack segment stack dw 128 dup(?) stack ends code segment assume cs:code,ds:data,ss:stack start:movax,data mov ds,ax mov ax,offset array push ax;数组偏移地址进栈 movax,cont push ax;元素个数进栈 callfindmin movmin,ax;保存出口参数 movah,4ch int21h Date 20 第1章 汇编语言基础知识 9 章 子程序的设计 计算机科学与技术系 汇编语言程序设计汇编语言程序设计 9.2 9.2 子程序的参数传递子程序的参数传递 9.2.3 用堆栈传递参数 ;子程序名:findmin ;功能:求有符号字数组中元素的最小值 ;入口参数:数组首地址和元素个数在堆栈中 ;出口参数:ax中存放最小值 findminproc pushbp movbp,sp;为取参数作准备 pushbx pushcx movbx,bp+6;从堆栈中取数组首地址送bx movcx,bp+4;从堆栈中取元素个数送cx deccx movax,bx;取出第一个元素给AX again:addbx,2 cmpbx,ax;与下一个数据比较 jgnext movax,bx next:loopagain popcx popbx popbp ret 4 fminendp code ends endstart Date 21 第1章 汇编语言基础知识 9 章 子程序的设计 计算机科学与技术系 汇编语言程序设计汇编语言程序设计 9.3 9.3 子程序嵌套与递归子程序嵌套与递归 一个子程序也可以作为调用程序去调用另一个子程序,称为子程序 嵌套。 递归子程序:如果一个子程序调用的是子程序的本身,就是递归 子程序。 例9.6编程计算n! 分析:求n!的递归定义为: 1 n=0 n!= n*(n-1)! n 0 Date 22 第1章 汇编语言基础知识 9 章 子程序的设计 计算机科学与技术系 汇编语言程序设计汇编语言程序设计 9.3 9.3 子程序嵌套与递归子程序嵌套与递归 Data segment Num db 3 Result dw ? Data ends Stack segment para stack stack db 100 dup(?) Stack ends Code segment assume cs:code, ds:data, ss:stack Main proc farMain proc far Begin: push ds xor ax, ax push ax mov ax, data mov ds, ax Date 23 第1章 汇编语言基础知识 9 章 子程序的设计 计算机科学与技术系 汇编语言程序设计汇编语言程序设计 9.3 9.3 子程序嵌套与递归子程序嵌套与递归 mov ah, 0 mov al, num call factorcall factor mov result, ax ret Main Main endpendp Factor procFactor proc push ax sub ax, 1 jne f_cont pop ax jmp return f_cont: call factorcall factor pop cx mul cl return: ret factor factor endpendp Code ends end begin IP1Mov result, ax 地址 3 IP2 Pop cx 地址 2 IP3 Pop cx 地址 1 ax =1 IP POP CX 地址 cx =2ax*cx =1*2 IP POP CX 地址 cx =3 ax*cx =1*2*3 IP Mov result, ax 地址 Date 24 第1章 汇编语言基础知识 9 章 子程序的设计 计算机科学与技术系 汇编语言程序设计汇编语言程序设计 9.4 9.4 子程序库子程序库 开发大型应用程序时,通常把复杂的程序分成很多功能独 立的模块,分别编写成子程序,对各个子程序模块单独进行汇 编产生相应的目标模块(OBJ文件),最后再用连接程序把它们 连接起来,形成一个完整的可执行程序。采用这种模块化程序 设计方法,程序不但结构清晰,也便于调试。 采用模块化程序设计,各模块之间会存在着相互调用,即 一个模块会引用在另一个模块中定义的标识符(包括变量、标 号、过程名等)。 标识符有两种: 1)在本模块中定义,供本模块使用的标识符称为局部标识符; 2)在一个模块中定义,而又在另一个模块中引用的标识符称为 外部标识符。 Date 25 第1章 汇编语言基础知识 9 章 子程序的设计 计算机科学与技术系 汇编语言程序设计汇编语言程序设计 9.4 9.4 子程序库子程序库 为了解决各模块间标识符的交叉访问,汇编语言提供了二条 伪指令PUBLIC和EXTRN。 (1)伪指令PUBLIC 说明:当前模块中哪些标识符是能被其它模块引用的外部标 识符。其格式如下: PUBLIC 标识符,标识符,;定义标识符的模块使用 (2)伪指令EXTRN 说明:在当前模块所使用的标识符中,哪些标识符是已在其 它模块中被定义为指定类型的标识符。 格式如下: EXTRN 标识符:类型,标识符:类型,;调用标识 符的模块使用 Date 26 第1章 汇编语言基础知识 9 章 子程序的设计 计算机科学与技术系 汇编语言程序设计汇编语言程序设计 9.4 9.4 子程序库子程序库 例9.7从键盘输入一个数n((0n6),求n!,并输出结果。 把例9.1、例9.2例和9.6的子程

温馨提示

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

评论

0/150

提交评论