微机原理与汇编语言实用教程_第7章_子程序设计.ppt
上传人:qw****27 上传时间:2024-09-12 格式:PPT 页数:27 大小:349KB 金币:15 举报 版权申诉
预览加载中,请您耐心等待几秒...

微机原理与汇编语言实用教程_第7章_子程序设计.ppt

微机原理与汇编语言实用教程_第7章_子程序设计.ppt

预览

免费试读已结束,剩余 17 页请下载文档后查看

15 金币

下载此文档

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

第7章子程序设计7.1子程序设计方法2.子程序的调用和返回指令(1)子程序的调用指令CALLCALL指令实现调用子程序的功能。根据主程序与子程序在内存中所处的位置关系和使用不同的寻址方式,可以分为段内直接、段内间接、段间直接、段间间接4种调用方式。①段内直接调用格式:CALL子程序名功能:程序转到子程序处执行。SP←SP-2,SS:[SP]←IP(保存16位返回地址),IP←子程序入口的偏移地址例如:CALLPROC1,其中PROC1就是一个子程序名。②段内间接调用格式:CALLREG16/MEM16功能:子程序的目标地址存放在16位的寄存器或者存储单元中。SP←SP-2,SS:[SP]←IP(保护16位返回地址),IP←REG16/MEM16。例如:LEACX,PROC1CALLCX或ADDR_PROC1DWPROC1;子程序偏移地址放入存储器字变量…CALLADDR_PROC1;调用子程序PROC1③段间直接调用格式:CALL子程序名功能:子程序和主程序在不同的段中。SP←SP-2,SS:[SP]←CS,SP←SP-2,SS:[SP]←IP(保存32位返回地址,偏移地址保存在较小地址处),IP←子程序入口的偏移地址,CS←子程序入口的段基址。例如:CALLPROC2(2)子程序返回指令RETRET指令用于实现结束子程序的执行返回主程序,一般放在子程序的末尾。①无参数段内返回格式:RET功能:IP←SS:[SP],SP←SP+2。②有参数段内返回格式:RET[N]功能:IP←SS:[SP],SP←SP+2,SP←SP+N。③无参数段间返回格式:RET功能:IP←SS:[SP],SP←SP+2,CS←SS:[SP],SP←SP+2。④有参数段间返回格式:RET[N]功能:IP←SS:[SP],SP←SP+2,CS←SS:[SP],SP←SP+2,SP←SP+N。(3)现场保护CPU中的寄存器是大家共有的,如果主程序和子程序使用了同一个寄存器,那么该寄存器进入子程序前和从子程序返回后,其内容可能会发生变化,进而可能造成程序运行错误。所以,我们在子程序的一开始就应该将子程序中有可能用到的寄存器的值压入堆栈保护起来(保护现场),在子程序返回之前再将这些值从堆栈中弹出到相应的寄存器中(恢复现场)。以保证寄存器的内容在子程序调用前后不会发生变化。于是,子程序的基本格式如下:子程序名PROC[NEAR/FAR]PUSH…;保护现场(寄存器/存储器)PUSH…;个数根据具体情况决定…;子程序主体…POP…;恢复现场,注意出栈次序POP…;先进栈的寄存器后出栈RET;返回子程序名ENDP例如,一个子程序SUB中要用到AX、BX、CX寄存器,则应该按如下方式来编写子程序:SUBPROCPUSHAXPUSHBXPUSHCX…POPCXPOPBXPOPAXRETSUBENDP7.1.2子程序的参数传递方法及应用举例1.用寄存器传递参数把参数的值放在约定的寄存器传递给子程序,或者,由子程序返回给主程序。寄存器传递参数是汇编语言中最常见的也是最简单的方法。由于寄存器个数有限,这种方法对少量数据可以直接传递数值,而对大量数据只能传递地址。例7.1已知两个数组:ARRRAY1和ARRAY2,要求对两个数组分别求和,结果存入SUM1和SUM2中。在本例中,可以把指定数组的符号地址存入寄存器SI中带入子程序中,结果由AX寄存器带回并存入SUM1和SUM2中。DATASEGMENTARRAY1DW1,3,4,5,7,9LEN1EQU$-ARRAY1;定义数组ARRAY1所占的存储单元数ARRAY2DW2,4,6,8LEN2EQU$-ARRAY2;定义数组ARRAY2所占的存储单元数SUM1DW?SUM2DW?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATAMAINPROCNEARMOVAX,DATAMOVDS,AXMOVCX,LEN1/2;将数组ARRAY1的长度(字数)存入CXLEASI,ARRAY1;将数组ARRAY1的首地址存入SIMOVAX,0;累加器清0CALLSUM;调用子程序SUMMOVSUM1,AX;将数组ARRAY1的元素之和存入SUM1MOVCX,LEN2/2;将数组ARRAY2的长度(字数)存入CXLEASI,ARRAY2;将数