微机原理及应用3-10_第1页
微机原理及应用3-10_第2页
微机原理及应用3-10_第3页
微机原理及应用3-10_第4页
微机原理及应用3-10_第5页
已阅读5页,还剩42页未读 继续免费阅读

下载本文档

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

文档简介

格式:子程序名

PROC

[类型]

(子程序内容)RET

子程序名

ENDP

3.10子程序设计子程序——具有一定功能的独立程序段。说明:子程序名属性①段属性——子程序所在的段地址;

②偏移属性——子程序第一条指令的偏移地址;

类型属性——NEAR/FAR型,NEAR可省略。主程序子程序返回地址(断点地址)一.子程序调用与返回指令1.子程序调用指令CALL功能:①保护断点(断点地址压栈保护); ②转子程序(子程序入口地址→IP/CS,IP)。(1)段内直接调用子程序和主程序在同一代码段中。

格式:CALL子程序名

操作:(SP-1,SP-2)←IP,SP←SP-2; IP←子程序入口偏移地址(由子程序名决定)。调用范围:64KB。SP→SP→IPHIPLSS:堆栈例:…

CALL

NAC …

NACPROC … RET NACENDP(2)段内间接调用指令子程序和主程序在同一代码段中。格式:CALLOPR;OPR≡{R,M(字)}或CALLWORDPTROPR操作:SP←SP-2;[SP,SP+1]←IP;保护断点

IP←[EA];子程序入口EA为依寻址方式所得的有效地址例3.32 CALLWORD PTR[BX] CALLBX CALLWORD PTR[BP][SI] CALLWORD PTRES:[SI]其中第二条指令,子程序入口偏移地址就是BX的内容,其他三条指令的入口偏移地址都是存放在采用各种存储器寻址方式的相邻二个内存单元中。由于是段内调用,CS值保持不变。(3)段间直接调用

格式:CALLFARPTR子程序名;操作:(SP-1,SP-2)←CS,SP←SP-2;保护断点 (SP-1,SP-2)←IP,SP←SP-2; CS←子程序入口段地址;转子程序入口 IP←子程序入口偏移地址。

调用范围:1MB。SP→SP→IPHIPLCSHCSLSP→SS(4)段间间接调用格式:CALLDWORDPTROPR;

OPR≡{M(双字)}操作:(SP-1,SP-2)←CS,SP←SP-2;保护断点(SP-1,SP-2)←IP,SP←SP-2;IP←(EA);转子程序入口CS←(EA+2)。调用范围:1MB。例:CALLDWORDPTR[BX];CALLDWORDPTRVALUE[BP][SI];2、返回指令

格式:RET;

功能:恢复断点(栈顶断点地址→IP/CS,IP)。

操作:①段内调用的RET指令IP←(SP,SP+1),SP←SP+2。②段间调用的RET指令IP←(SP,SP+1),SP←SP+2;CS←(SP,SP+1),SP←SP+2。

说明:RET是段内/段间返回,取决于CALL

的属性(段内/段间),系统自动调用。

二、保护现场和恢复现场 子程序中要用到某些寄存器,而这些寄存器中又存放有主程序的有用信息。子程序执行前,将这些寄存器的内容加以保护—保护现场;子程序执行后,恢复这些寄存器的内容—恢复现场。 通常在子程序一开始,利用PUSH指令将有关的内容压入堆栈保护;在子程序执行返回指令前用POP指令从堆栈中取出数据,弹回原来的寄存器。当然,保护和恢复现场的工作也可在主程序中完成。

保护现场与恢复现场通常用成对的PUSH/POP指令完成。例3.35

SUB1PROCFAR PUSH AX; PUSH BX;保护现场 PUSHCX; PUSHDX;

…;(子程序实际内容) POP DX; POP CX;恢复现场 POP BX;(后进先出) POP AX;

RET;SUB1 ENDP;三、

子程序的说明文件(1)子程序名:一般取具有象征意义的标识符。(2)子程序的功能:说明子程序完成的具体任务。(3)子程序所占用寄存器和工作单元的情况。

(4)子程序的入口参数:说明子程序运行所需的参数以及存放位置。(5)子程序的出口参数:说明子程序运行完毕的结果参数及存放的位置。(6)子程序示例:通过所举示范例子,把具体的参数值代入,使之更具体了解子程序的功能。例3.34有一子程序说明文件如下①子程序名:DTOB②功能:完成将两位十进制数(BCD码)转换成二进制数。③入口参数:AL寄存器中存放要转换的十进制数。④出口参数:CL寄存器中存放转换后的二进制数。⑤占用寄存器:BX⑥示例:输入AL=01010110B(56)

输出CL=00111000B1.寄存器传送参数例3.36统计一个字中的“1”的个数。

算法1)用BCNT1子程序完成统计一字节中“1”的个数。2)用AL作入口参数,存放被统计的字节;3)用BX作出口参数存放统计结果。

子程序的说明文件为:;子程序名:BCNT1;功能:统计一个字节中的“1”的个数;入口参数:AL-需要统计1的个数的字节数;出口参数:统计结果存入BX四、主程序与子程序之间参数的传递及其举例主程序AX←取数据CALLBCNT1PUSHBXAL←AHCALLBCNT1POPAXAX←AX+BX存结果END子程序BCNT1BX←0CX←08HROLAL,1CF=0BX←BX+1CX-1≠0RETYNN?;主程序(主、子程序同段)

ASTACKSEGMENTSTACK DW256DUP(?) TOP LABELWORD

ASTACKENDS

DATASEGMENT TW DW1234HTWS DW00H

DATAENDS

CODESEGMENTASSUMECODE:CS,DATA:DS,STACK:SSSTART:MOVAX,DATAMOVDS,AX MOVAX,ASTACK MOVSS,AX MOVSP,OFFSETTOP MOVAX,TW

CALLBCNT1;近程调用 PUSHBX MOV AL,AH

CALLBCNT1;近程调用 POP AX ADD AX,BX MOVTWS,AXMOVAH,4CH; INT21H;BCNT1PROC ;段内子程序MOVBX,0; MOVCX,08H;LOOP1:ROLAL,1; JNCNEXT; INCBX;NEXT:LOOPLOOP1; RET;

BCNT1ENDP

CODE ENDS; ENDSTART;说明:

用BCNT1作标号可省去过程定义。;主程序(主、子程序不同段)STACKSEGMENTSTACK;

DW256DUP(?);TOP LABELWORD; STACK ENDS DATA SEGMENTTW DW1234H;TWS DW00H;存结果DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKSTART: MOVAX,DATA; MOVDS,AX;

MOVAX,STACK; MOVSS,AX; MOVSP,OFFSETTOP; MOV AX,TW;

CALL

FARPTRBCNT1

;远程调用

PUSH BX;第一次统计结果入栈 MOV AL,AH;

CALL

FARPTR

BCNT1

;远程调用

POP AX;第一次统计结果送AX ADD AX,BX; MOV TWS,AX;存统计结果 MOV AH,4CH; INT 21H;CODE ENDS;LOOP1: ROL AL,1; JNC NEXT; INC BX;NEXT: LOOPLOOP1; RET;

BCNT1ENDPCODE1 ENDS; ENDSTART;源程序结束

CODE1SEGMENT;子程序ASSUMECS:CODE1;

BCNT1PROCFAR MOVBX,0; MOVCX,08H;2.用堆栈传送参数利用堆栈不仅可用来保存返回地址,而且还可以用来存放主程序和子程序之间传递的参数数据。用堆栈传递参数的方法是在调用子程序之前,用PUSH指令将入口参数压入堆栈,在子程序中通过出栈方式依次获得这些参数。经过子程序操作处理后再将出口参数压入堆栈,返回主程序后再通过出栈获得结果。使用这种方式传递参数时,特别要注意堆栈中断点的保存与恢复。例3.37编一数据模块传送子程序,指定用堆栈来传递参数。;子程序名:MOVTOM;功能:完成数据块的传送;入口参数:源数据块首址,目的数据块首址,数据块长度均通过堆栈传送;出口参数:在内存单元DEST开始存放传送好的数据块;主程序STACKSEGMENTSTACK DW256DUP(?)TOPLABELWORDSTACKENDSDATA SEGMENTSOUCEDB38H,7CH,0AFH,…COUNTEQU$-SOUCEDEST DBCOUNTDUP(?)DATA ENDSCODE SEGMENT ASSUMECS:CODE,DS:DATA,SS:STACKSTART:MOVAX,DATA MOVDS,AX MOV AX,STACK MOV SS,AX LEA SP,TOP MOV SI,OFFSETSOUCE MOV DI,OFFSETDEST MOV CX,COUNT

PUSH CX

;数据块长度进栈

PUSH DI

;目的数据块首地址栈

PUSH SI

;源数据块首地址进栈

CALL MOVTOM…MOVTOM PROCNEAR

POPBX ;取出断点

POPSI

;源数据块首址出栈

POPDI

;目的数据块首址出栈

POPCX

;数据块长度出栈

PUSHBX ;保存断点LOP1:MOVAL,[SI] MOV[DI],AL INCSI INCDI LOOP LOP1 RETMOVTOM ENDPCODEENDS3.用存储单元传递参数主程序在调用子程序前,将所有入口参数按约定的次序存入存储区的某一区域内,进入子程序后按约定从该存储区中取出输入参数进行处理,所得出口参数也按约定的次序存入指定存储区,返回主程序后就可取得结果。

例3.38

把4个字节单元的非压缩型BCD码(高4位为0)压缩为4位压缩型BCD码,存放到指定的BCD码单元中。

该子程序的入口参数是存放4个字节的非压缩型BCD码的首址BUF。出口参数,即压缩合并后的4位BCD码,存放在字单元BCDE中,都是通过存储单元来传递参数的。;子程序名:MERGE;功能:将4位非压缩型BCD码压缩成4位压缩型BCD码;入口参数:4位非压缩型BCD码存放在BUF开始的单元中;出口参数:压缩后的4位BCD码存放在BCDE字单元中MERGEPROCNEAR

PUSHAX ;保护现场 PUSHBX PUSHCX;PUSHCL? PUSHSI MOVSI,OFFSETBUF;取首址 MOVAL,[SI] ;取一位BCD码 MOVBL,[SI+1] ;再取一位BCD码MOVCL,4 SHLBL,CL ;左移4位 ADDAL,BL ;合并两位BCD码 MOVAH,[SI+2] ;取一位BCD码 MOVBH,[SI+3] ;再取一位BCD码 MOVCL,4 SHLBH,CL ;左移4位 ADDAH,BH ;合并两位BCD码 MOVBCDE,AX;四位压缩BCD码送BCDE单元

POPSI ;恢复现场(能不能在主程序中pop) POPCX POPBX POPAX RETMERGEENDP4、子程序综合举例例3.39

编写将n个8位无符号二进制数排成递增序列的子程序SORT。将例3.28改写成子程序,以供调用。入口参数:①存放n个数的字节存储区首址;②待排序的元素个数n。出口参数:已排序的数仍存放在字节存储区中。由于要传递的参数不多,故可采用寄存器方式传递参数。

子程序SORT的说明及程序如下:;子程序名:SORT;功能:将一组8位无符号二进制数按递增顺序排列。;入口参数 BX——存放待排序数组存储区首址 CX——存放待排序数组元素的个数;出口参数:已排成递增序列的n个无符号数仍存放在由BX指示首址的字节存储区中。五、子程序的嵌套与递归

1.子程序的嵌套子程序嵌套是指子程序本身再次调用别的子程序。…Callsub1……Callsub2…RET…Callsub3…RET………RET主程序子程序1子程序2子程序3ADR1ADR2ADR3注意:(1)嵌套过程中的逐层调用及按层返回是由堆栈保证的。即先调用的后返回,而后调用的先返回。ADR1ADR2ADR3CALLSUB1SPSPSPSPCALLSUB2CALLSUB3调用ADR1ADR2ADR3CALLSUB1SPSPSPSPCALLSUB2CALLSUB3返回(2)除了调用和返回外,在子程序中还可能会用到堆栈,必须指出的是,子程序中若需使用堆栈,则压入操作与弹出操作必须成对。只有这样,才能保证每个子程序返回前SP恰好指向返回地址。递归子程序对应于数学上对函

温馨提示

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

评论

0/150

提交评论