汇编第06章子程序结构

上传人:子 文档编号:57188752 上传时间:2018-10-19 格式:PPT 页数:24 大小:116KB
返回 下载 相关 举报
汇编第06章子程序结构_第1页
第1页 / 共24页
汇编第06章子程序结构_第2页
第2页 / 共24页
汇编第06章子程序结构_第3页
第3页 / 共24页
汇编第06章子程序结构_第4页
第4页 / 共24页
汇编第06章子程序结构_第5页
第5页 / 共24页
点击查看更多>>
资源描述

《汇编第06章子程序结构》由会员分享,可在线阅读,更多相关《汇编第06章子程序结构(24页珍藏版)》请在金锄头文库上搜索。

1、第六章 子程序设计,2018/10/19,2,第六章子程序设计,6.1 子程序设计 一、子程序 在程序设计中,我们会发现一些多次无规律重复的程序段或语句序列。解决此类问题一个行之有效的方法就是将它们设计成可供反复调用的独立的子程序结构,以便在需要时调用。在汇编语言中,子程序又称过程。 调用子程序的程序称为主调程序或主程序。,2018/10/19,3,6.1子程序设计 二、子程序调用和返回指令 1、CALL:子程序(过程)调用 与JMP指令类似,CALL指令包括下列4种调用方式: 段内直接调用 段间直接调用 段内间接调用 段间间接调用 段内调用在同一代码段内进行,又称近(Near)调用; 段间调

2、用可以在不同代码段之间进行,又称远(Far)调用。,第六章子程序设计,2018/10/19,4,Call指令,语法格式: CALL ProcName ; 若ProcName与该指令在同一代码段,则为段内直接调用: ; IP进栈,IP = label的偏移地址; ; 若ProcName与该指令不在同一代码段,则为段间直接调用: ; CS:IP 进栈,CS:IP = label的分段地址 如:CALL SUB1 CALL reg16/mem16 ; 段内间接调用:IP进栈,IP = reg16 / mem16 如:CALL BX 或 CALL WORD PTR BX CALL mem32 ; 段间

3、间接调用: ; CS:IP 进栈,CS = mem32高字,IP = mem32低字 如:CALL DWORD PTR BX 功能描述: (1)返回地址进栈。 远调用:CS与IP(下一条指令的地址)依次进栈。 近调用:IP(下一条指令的16位偏移地址)进栈。 (2)转移到过程的第1条指令去执行。 远调用:根据操作数,将32位分段地址送CS:IP。 近调用:根据操作数,将16位偏移地址送IP。 对标志位的影响:无。,2018/10/19,5,6.1子程序设计 二、子程序调用和返回指令 2、RET指令:过程返回 过程返回分为近(段内)返回和远(段间)返回。,第六章子程序设计,6,RET返回指令,语

4、法格式: RET ; 近返回或远返回 RET imm16 ; 近返回或远返回,并调整堆栈:SP = SP + imm16 功能描述: RET:返回地址出栈,从而实现转移到返回地址处。 远返回:POP 1个双字到CS:IP。 近返回:POP 1个字到IP。 RET imm16:在返回地址出栈后,CPU立即将imm16加到堆栈指针SP。这种机制用来在返回前将参数从栈中移出(如BASIC对汇编的调用)。 对标志位的影响:无。 说明:RET由汇编器根据其所在过程的类型(NEAR或FAR)决定是近返回还是远返回。缺省为近返回。,2018/10/19,7,6.1子程序设计 三、子程序设计 1、定义:过程定

5、义由PROC与ENDP伪指令实现, 形式如下: 过程名 PROC NEAR|FAR 过程名 ENDP 过程名在整个程序中必须是唯一的。 过程名本质上与标号一样,也具有3种属性:段地址、偏移地址和类型(NEAR或FAR)。 PROC后用关键字NEAR、FAR或空,以表示过程的类型(缺省为NEAR)。 原则:同一代码段用Near 不同代码段用Far,第六章子程序设计,2018/10/19,8,2、子程序结构 (1)同一代码段 Code segment Main proc far Ret Main Endp Sub1 Proc Near Ret Sub1 Endp Code Ends,(2)不同代码

6、段 Code segment Sub proc far Ret Sub Endp Call Sub Code Ends Code1 Segment Call Sub Sub1 Endp,2018/10/19,9,主过程看成由DOS直接调用的一个子过程,故需要用FAR属性,2018/10/19,10,6.1子程序设计 三、子程序设计 3、程序设计注意 现场保护 入栈 需要保护的内容:寄存器,标志寄存器等 现场恢复 出栈 需要恢复的内容:现场保护的内容,第六章子程序设计,2018/10/19,11,6.1子程序设计 三、子程序定义 3、过程定义由PROC与ENDP伪指令实现, 形式如下: 过程名

7、PROC NEAR|FAR 过程名 ENDP 过程名在整个程序中必须是唯一的。 过程名本质上与标号一样,也具有3种属性:段地址、偏移地址和类型(NEAR或FAR)。 PROC后用关键字NEAR、FAR或空,以表示过程的类型(缺省为NEAR)。 原则:同一代码段用Near 不同代码段用Far,第六章子程序设计,2018/10/19,12,子程序说明,便于使用,举例,设计一求两个数的最大公约数的子程序 ;子程序名:MCDST ;功能:求两个正整数的最大公约数 ;入口参数:两个正整数存放分别到AX和BX中 ;出口参数:最大公约数存放到CX中 ;占用资源:CX,无MEM单元,2018/10/19,13

8、,MCDST PROC NEAR PUSH AX PUSH BX PUSH DX ;保护现场 CMP AX,BX JNC AGAIN XCHG AX,BX AGAIN: XOR DX,DX DIV BX AND DX,DX JZ EXIT ;余数为0时,除数即为最大公约数 MOV AX,BX MOV BX,DX JMP AGAIN EXIT: MOV CX,BX POP DX ;恢复现场 POP BX POP AX RET MCDST ENDP,2018/10/19,14,例 利用子程序MCDST求DATA1、DATA2、DATA3三个字无符号数的最大公约数并存放到DATA4单元中。,DATA

9、 SEGMENT DATA1 DW 1000 DATA2 DW 800 DATA3 DW 500 DATA4 DW ? DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOX DS,AX MOV AX,DATA1 MOV BX,DATA2 CALL MCDST MOV AX,CX MOV BX,DATA3 CALL MCDST MOV DATA4,CX MOV AH,4CH INT 21H,2018/10/19,15,MCDST PROC NEAR PUSH AX PUSH BX PUSH DX ;保护现场 CMP

10、 AX,BX JNC AGAIN XCHG AX,BX AGAIN: XOR DX,DX DIV BX AND DX,DX JZ EXIT ;余数为0时,除数即为最大公约数 MOV AX,BX MOV BX,DX JMP AGAIN EXIT: MOV CX,BX POP DX ;恢复现场 POP BX POP AX RET MCDST ENDP CODE ENDS END START,2018/10/19,16,例 求CMN=M!/(N!*(M-N)!)的值(MN)。设M!的值不超过两个字节。,分析:应使用子程序设计方法。设计一子程序求X!。 ;子程序名:SUB1 ;入口参数:将X存放到CX

11、 ;出口参数:AX为CX! ;使用资源:AX、CX,SUB1 PROC MOV AX,1 AGAIN:MUL CX LOOP AGAIN RET SUB1 ENDP,2018/10/19,17,DATA SEGMENT M EQU 8 N EQU 3 RES DW ? DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX MOV CX,N CALL SUB1 MOV BX,AX MOV CX,M CALL SUB1 DIV BX ;M!/N! MOV BX,AX MOV CX,M SUB CX,N C

12、ALL SUB1 ;(M-N)! XCHG BX,AX DIV BX MOV RES,AX MOV AH,4CH INT 21H,SUB1 PROC MOV AX,1 AGAIN: MUL CX LOOP AGAIN RET SUB1 ENDP CODE ENDS END START,2018/10/19,18,6.1子程序设计 三、子程序定义 4、使用过程应注意的问题 在过程体内必须有一条RET指令被执行到。如果在过程内没有执行到RET或其它转移指令,程序将继续执行ENDP后的指令,从而产生错误。 正确选择过程的类型。通常基于下列原则: 若过程只在同一代码段中被调用,则定义为NEAR。 若过

13、程可以在不同代码段中被调用,则定义为FAR。 CALL与RET的类型要一致。 通常要保证RET指令执行前,栈顶内容正好是返回地址。 注意保护相关寄存器的值。通常,除了作为返回参数的寄存器外,过程不应改变其它寄存器的值。 可以将过程定义放在单独的代码段中。若过程定义与主程序处于同一代码段,则要保证其只有被调用时,才会执行。 子程序设计应考虑其通用性(根据实际情况,够用即可)。一般地,入口参数越多越通用。,第六章子程序设计,2018/10/19,19,作业:P240 6,2018/10/19,20,6.2子程序的参数传递方法,一、通过寄存器传送参数,2018/10/19,21,二、如过程和调用程序

14、在同一源文件中,则过程可直接访问模块中的变量,Data segment Ary dw 100 dup(?) Count dw 100 Sum dw ? Data ends Main proc far Assume cs:code,ds:data Start: Call near ptr proad Main endp,Proad proc near Push ax Push cx Push si Lea si,ary Mov cx,count Xor ax,ax Next:add ax,si Add si,2 Loop next Mov sum,ax,Pop si Pop cx Pop ax

15、Ret Proad endp Code ends End start,2018/10/19,22,三、通过地址表传送参数地址,Prog segment Org 100h Assume cs:prog,ds:prog,ss:prog Main proc near Mov table,offst ary Mov table+2,offset count Mov table+4,offset sum Mov bx,offset table Call proad Int 20h Main endp,Proad proc near Push ax Push cx Push si Push di Mov

16、si,bx Mov di,bx+2 Mov cx,di Mov di,bx+4 Xor ax,ax Next:add ax,si Add si,2 Loop next,Mov di,ax Pop di Pop si Pop cx Pop ax Ret Proad endp Ary dw 100 dup(?) Count dw 100 Sum dw ? Table dw 3 dup(?) Prog ends End main,2018/10/19,23,四、通过堆栈传送参数或参数地址,Parm segment Ary dw 100 dup(?) Count dw 100 Sum dw ? Parm ends Stck segment Dw 100 dup(?) Tos label words Stck ends Main proc far Assume cs:code1,ds:parm,ss:stck Start:mov ax,stck mov ss,ax Mov sp,offset tos Push ds Sub ax,ax Push ax,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 科普知识

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号