微机原理与汇编语言实用教程_第7章_子程序设计.ppt_第1页
微机原理与汇编语言实用教程_第7章_子程序设计.ppt_第2页
微机原理与汇编语言实用教程_第7章_子程序设计.ppt_第3页
微机原理与汇编语言实用教程_第7章_子程序设计.ppt_第4页
微机原理与汇编语言实用教程_第7章_子程序设计.ppt_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

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

文档简介

1、第7章 子程序设计,7.1子程序设计方法,7.1.1 子程序的定义、调用与返回 1. 子程序的定义 子程序的定义是由子程序(过程)定义伪指令PROC和ENDP来完成的。其格式如下: 过程名 PROC NEAR/FAR 过程名 ENDP 其中PROC表示过程定义开始,ENDP表示过程定义结束。过程名是过程入口地址的符号表示。,2. 子程序的调用和返回指令 (1)子程序的调用指令CALL CALL指令实现调用子程序的功能。根据主程序与子程序在内存中所处的位置关系和使用不同的寻址方式,可以分为段内直接、段内间接、段间直接、段间间接4种调用方式。 段内直接调用 格式:CALL子程序名 功能:程序转到子

2、程序处执行。SP SP-2,SS:SP IP(保存16位返回地址),IP 子程序入口的偏移地址 例如:CALLPROC1 ,其中PROC1就是一个子程序名。, 段内间接调用 格式:CALLREG16/MEM16 功能:子程序的目标地址存放在16位的寄存器或者存储单元中。SP SP-2,SS:SP IP(保护16位返回地址),IP REG16/MEM16。 例如:LEA CX,PROC1 CALL CX 或 ADDR_PROC1 DW PROC1;子程序偏移地址放入存储器字变量 CALLADDR_PROC1;调用子程序PROC1, 段间直接调用 格式:CALL 子程序名 功能:子程序和主程序在不

3、同的段中。SP SP-2,SS:SP CS,SP SP-2,SS:SP IP(保存32位返回地址,偏移地址保存在较小地址处),IP 子程序入口的偏移地址,CS 子程序入口的段基址。 例如:CALL PROC2, 段间间接调用 格式:CALLMEM32 功能:SP SP-2,SS:SP CS,SP SP-2,SS:SP IP,IP MEM32,CSMEM32+2。目标地址必须为双字存储单元,高地址字的内容为子程序所在段的段基地址,低地址字的内容为相应段的偏移地址。 例如:ADD_PROC2 DD PROC2;子程序入口地址放入存储器双字变量 CALLADD_PROC2 ;调用子程序PROC2,(

4、2)子程序返回指令RET RET指令用于实现结束子程序的执行返回主程序,一般放在子程序的末尾。 无参数段内返回 格式: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中的寄存器是大家共有的,如果主程序和子程序使用了同一个寄存器,那么该寄存器进入子程序

5、前和从子程序返回后,其内容可能会发生变化,进而可能造成程序运行错误。 所以,我们在子程序的一开始就应该将子程序中有可能用到的寄存器的值压入堆栈保护起来(保护现场),在子程序返回之前再将这些值从堆栈中弹出到相应的寄存器中(恢复现场)。以保证寄存器的内容在子程序调用前后不会发生变化。,于是,子程序的基本格式如下: 子程序名 PROCNEAR/FAR PUSH;保护现场(寄存器/存储器) PUSH;个数根据具体情况决定 ;子程序主体 POP ;恢复现场,注意出栈次序 POP ; 先进栈的寄存器后出栈 RET;返回 子程序名 ENDP,例如,一个子程序SUB中要用到AX、BX、CX寄存器,则应该按如下

6、方式来编写子程序: SUBPROC PUSHAX PUSHBX PUSHCX POPCX POPBX POPAX RET SUBENDP,7.1.2 子程序的参数传递方法及应用举例 1用寄存器传递参数 把参数的值放在约定的寄存器传递给子程序,或者,由子程序返回给主程序。寄存器传递参数是汇编语言中最常见的也是最简单的方法。由于寄存器个数有限,这种方法对少量数据可以直接传递数值,而对大量数据只能传递地址。 例7.1 已知两个数组:ARRRAY1和ARRAY2,要求对两个数组分别求和,结果存入SUM1和SUM2中。 在本例中,可以把指定数组的符号地址存入寄存器SI中带入子程序中,结果由AX寄存器带回

7、并存入SUM1和SUM2中。,DATASEGMENT ARRAY1DW1,3,4,5,7,9 LEN1EQU$-ARRAY1;定义数组ARRAY1所占的存储单元数 ARRAY2DW2,4,6,8 LEN2EQU$-ARRAY2;定义数组ARRAY2所占的存储单元数 SUM1DW? SUM2DW? DATAENDS CODESEGMENT ASSUMECS:CODE,DS:DATA MAINPROCNEAR MOVAX,DATA MOVDS,AX MOVCX,LEN1/2;将数组ARRAY1的长度(字数)存入CX LEASI,ARRAY1;将数组ARRAY1的首地址存入SI MOVAX,0;累加

8、器清0 CALLSUM;调用子程序SUM MOVSUM1,AX;将数组ARRAY1的元素之和存入SUM1 MOVCX,LEN2/2;将数组ARRAY2的长度(字数)存入CX LEASI,ARRAY2;将数组ARRAY2的首地址存入SI,MOVAX,0;累加器清0 CALLSUM;调用子程序SUM MOVSUM2,AX;将数组ARRAY2的元素之和存入SUM2 MOVAH,4CH INT21H MAINENDP SUMPROCNEAR LOOP1:ADDAX,SI ADDSI,2 LOOPLOOP1 RET SUMENDP CODE ENDS ENDMAIN,2用内存单元传递参数 这种方法是在主

9、程序中建立存储区域,把要传送给子程序的参数都存放其中,子程序从中取出参数,再将运算结果放入主程序指定的存储单元中。 例7.2 字符串的屏幕显示。 STACK SEGMENTSTACK DW100H DUP (?) STACK ENDS DATA SEGMENT STRING DBABCDEFG,00H ADDR1 DW? DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK MAINPROCNEAR MOVAX,DATA MOVDS,AX MOVAX,OFFSETSTRING MOVADDR1,AX;用内存单元ADDR1传递参数 CALL

10、DISPLAY;调用显示子程序DISPLAY MOVAH,4CH INT21H MAINENDP,DISPLAYPROC PUSHAX PUSHDX PUSHSI;保护现场 MOVSI,ADDR1 DISP1: MOVAL,SI;取字符串中的数据 CMPAL,0 JZDISPEXIT;已经到串最后 MOVDL,AL;显示一个ASCII字符 MOVAH,2 INT21H INCSI;指向下一个字符 JMPDISP1 DISPEXIT:MOVDL,0DH;显示回车换行 MOVAH,2 INT21H MOVDL,0AH MOVAH,2 INT21H POPSI;恢复现场 POPDX POPAX RE

11、T DISPLAYENDP CODEENDS ENDMAIN,3. 用堆栈传递参数 使用堆栈传递参数时,首先在调用子程序之前将参数压入堆栈,在子程序中通过基址寻址获得压入堆栈的参数,子程序处理后的结果也送入堆栈保存。返回主程序后,再通过堆栈弹出指令取出结果。它特别适合于不同模块之间过程的参数传递。 例7.3 同例题7.2,但通过堆栈来传送字符串的首地址。 STACK SEGMENTSTACK DW100H DUP (?) STACK ENDS DATASEGMENT STRING DBABCDEFG,00H ADDR1 DW? DATAENDS CODESEGMENT ASSUME CS:CO

12、DE,DS:DATA,SS:STACK MAIN PROCNEAR MOVAX,DATA MOVDS,AX MOVAX,OFFSETSTRING PUSHAX;将字符串首地址压入堆栈 CALLDISPLAY;调用显示子程序DISPLAY MOVAH,4CH INT21H MAIN ENDP,DISPLAYPROC PUSHAX;保护现场 PUSHBP PUSHDX PUSHSI MOVBP,SP MOVSI,BP+8;字符串的首地址送入SI DISP1: MOVAL,SI;取字符串中的数据 CMPAL,0 JZDISPEXIT;已经到串最后 MOVDL,AL;显示一个ASCII字符 MOVAH

13、,2 INT21H INCSI;指向下一个字符 JMPDISP1 DISPEXIT: MOVDL,0DH;显示回车换行 MOVAH,2 INT21H MOVDL,0AH MOVAH,2 INT21H POPSI POPDX POPBP;恢复现场 POPAX RET DISPLAYENDP CODEENDS ENDMAIN,7.2 宏 7.2.1 宏定义与宏结束指令 1.定义宏 (1)不带参数的宏定义 MNAME MACRO 宏体 ENDM (2)带参数的宏定义 MNAME MACRO DUMPAR1,DUMPAR2 宏体 ENDM,2.宏调用与宏展开 一个具有独立功能的程序段被定义为宏以后,就

14、可以在源程序中调用了。在操作码段写上宏名,也就是使用宏指令,称为宏调用。 对于带参数的宏调用,PAR1,PAR2,是实参。实参与形参的意义和出现次序必须一致,但参数的个数不一定相等。当实参多于形参时,多余的实参被忽略。当实参少于形参时,则多余的形参被忽略。,例7.4字变量加法 DSEGSEGMENT V1 DW 1234H V2 DW 1111H V3 DW ? DSEG ENDS SSEG SEGMENT STACK STK DB 20 DUP(0) SSEG ENDS CSEG SEGMENT ASSUME DS:DSEG,SS:SSEG,CS:CSEG DADD MACRO X,Y,Z

15、;宏定义 PUSH AX MOVAX,X ADDAX,Y MOV Z,AX POPAX ENDM,START:MOVAX,DSEG MOVDS,AX MOVAX,SSEG MOV SS,AX MOV SP,LENGTH STK DADD V1,V2,V3 ;宏调用 MOV AH,4CH INT21H CSEGENDS ENDSTART,宏展开: +PUSH AX +MOV AX,V1 +ADD AX,V2 +MOV V3,AX +POP AX,3.宏指令的有效范围 宏指令的优先级最高。可以定义与指令助记符、伪操作同名的宏,此时,同名机器指令或伪操作失效。只有用PURGE伪操作取消宏定义,才能恢

16、复同名机器指令或伪操作的原始含义。PURGE伪操作可同时取消多个宏定义,被取消的宏名之间用逗号分隔。 格式为:PURGE MNAME1 ,MNAME2,MNAME3 其中:MNAME1,MNAME2,MNAME3,是宏定义名,多个将被取消的宏定义名用逗号分开。,4.宏库 如果希望某些宏定义能被多个程序调用,可以将这些宏定义放在一起以库文件的形式存放起来,这个库文件就是宏库。当一个源程序需要使用这些宏定义时,可以在程序中使用INCLUDE伪指令,其语句格式为:INCLUDE HNAME。其中HNAME是库文件名,其扩展名为.LIB。 宏汇编程序在汇编源程序时,如遇到INCLUDE伪指令,就将它指

17、定的库文件的内容扫描一遍,如同在源程序中进行库中的宏定义一样,因而其后的程序可以直接调用库中的宏定义。,7.2.2 参数的使用 (1)在宏定义、宏调用的参数中,经常使用的宏操作符有4个: 连接操作符& &操作符在宏定义体中可以作为形参的前缀,宏展开时将&前后两个符号连接形成一个符号。这个连接后的符号可以是指令助记符、操作数或是一个字符串。 文本操作符 在宏调用时,有的实参含空格或逗号,这时就必须使用文本操作符把一个完整的实参括起来,作为一个单一的实参。 表达式操作符% %操作符在宏调用时用在实参的前面,格式是:%表达式 汇编语言用%后表达式的值而不是表达式文本来取代对应的形参。 字符操作符!

18、!操作符用在宏调用中,格式是:!宏操作符 !操作符告诉宏汇编程序,其后的字符不作操作符使用,而是以字符本身的意义进行处理。如“!%”表示“%”不是表达式操作符,而是一个百分号。,(2)与宏中形参字符串对应的实参可以是数值、指令、寄存器名、存储单元名以及用寻址方式能找到的地址或表达式等。 如例7.4中的V1、V2可能是存储数值的内存单元地址,也可能是用等价定义伪指令定义的数值;V3可能是内存单元地址。 例7.5加减法运算。参数OP代表指令。,宏定义: MOP MACROOP,X,Y,Z PUSHAX MOVAX,X OP AX,Y MOV Z,AX POP AX ENDM,宏调用及宏展开: MO

19、P ADD,DA1,DA2, +PUSH AX +MOV AX,DA1 +ADD AX,DA2 +MOVWORD PTR RES,AX +POP AX MOP SUB,DA1+2,DA2+2, +PUSH AX +MOV AX,DA1+2 +SUB AX,DA2+2 +MOV WORD PTR RES+2,AX +POP AX,例7.6 寄存器循环移位。参数DIR代表指令的一部分,参数REG代表寄存器。 宏定义: REGROL MACRODIR,REG,CNT MOV CL,CNT RO&DIR REG,CL ENDM 宏调用及宏展开: REGROL L,AX,8 +MOV CL,8 +ROL AX,CL REGROL R,BL,4 +MOV CL,4 +ROR BL,CL,7.2.3 宏中的标号处理 在一个源程序中使用的标号必须惟一,这是编写汇编语言源

温馨提示

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

最新文档

评论

0/150

提交评论