概述
上机实验08 子程序设计
知识提要:
- 掌握子程序的定义语句;
过程名 PROC [near/far]
过程体
RET
过程名 ENDP
其中过程名的命名方法与变量名相同,同一源程序中不能有相同的过程名.PROC为过程定义开始的伪指令,ENDP为过程定义结束伪指令,且PROC-ENDP必须配对使用。配对的PROC-ENDP前面的过程名应相同。NEAR/FAR定义了过程的属性,前者表示所定义的过程只能被相同代码段的程序调用,称为段内调用;而后者所表示的过程只能被不同代码段的程序调用,称为段间远调用。
2.子程序结构形式
一个完整的子程序一般应包含下列内容:
- )子程序的说明部分
在设计了程序时,要建立子程序的文档说明,使用户能清楚此子程序的功能和调用方法.说明时,应含如下内容:
.子程序名:命名时要见名知意.
.子程序的功能:说明子程序完成的任务;
.子程序入口参数:说明子程序运行所需参数及存放位置;
.子程序出口参数:说明子程序运行结果的参数及存放位置;
.子程序所占用的寄存器和工作单元;
.子程序调用示例;
- )掌握子程序的调用与返回
在汇编语言中,子程序的调用用CALL,返回用RET指令来完成。当发生CALL过程调用时,返回地址入栈;而运行RET指令时,则由栈顶取出返回地址。
CALL指令执行分两步走;第一步,保护返回地址,利用堆栈实现,即将返回的地址压入堆栈;第二步,转向子程序,即把子程序的首地址送入IP或CS:IP。
RET指令功能是返回主程序,即把子程序的返回地址送入IP或CS:IP。
.段内调用与返回:调用子程序指令与子程序同在一个段内。因此只修改IP;
.段间调用与返回:调用子程序与子程序分别在不同的段,因此在返回时,需同时修改CS:IP。
3.)子程序的现场保护与恢复
保护现场:在子程序设计时,CPU内部寄存器内容的保护和恢复,在运行主程序时已经占用了一定数量的寄存器,子程序执行时也要使用寄存器。子程序执行完返回主程序后,要保证主程序按原来状态执行,这就需要对那些在主程序和子程序中都要使用的寄存器的内容在子程序体执行之前加以保护,这就是保护现场。
恢复现场:子程序执行完后再恢复这些主程序中寄存器的内容,称为恢复现场。
一般利用堆栈实现现场保护和恢复的格式:
过程名PROC [NEAR/FAR]
PUSH AX
|
PUSH BX
.
.
PUSH DX
.
|
.
.
POP DX
.
|
.
.
POP AX
RET
过程名 ENDP
4.子程序的参数传递方法
- 寄存器传递参数
这种方式是最基本的参数传递方式。即 主程序调用子程序前,将入口参数送到约定的寄存器中。子程序可以直接从这些寄存器中取出参数进行加工处理,并将结果也放在约定的寄存器中,然后返回主程序,主程序再从寄存器中取出结果。
- 存储器单元传(变量)递参数
这种方法是在主程序调用子程序前,将入口参数存放到约定的存储单元中;子程序运行时到约定存储位置读取参数;子程序执行结束后将结果也放在约定存储单元中。
- 用堆栈传递参数
利用共享堆栈区,来传递参数是重要的的方法之一。主程序将子程序的入口参数压入堆栈,子程序从堆栈中依次取出这些参数;经过子程序处理后,子程序将出口参数压入堆栈,返回主程序后再通过出栈获取它们。
一、实验要求和目的
1.熟悉汇编语言程序设计结构;
2.熟悉汇编语言子程序设计方法;
3.熟悉利用汇编语言子程序参数传递方法;
二、软硬件环境
1.硬件环境:微机CPU 486以上,500MB以上硬盘,32M以上内存;
2.软件环境:装有MASM 5.0、DEBUG、LINK和EDIT等应用程序。
三、实验涉及的主要知识单元
在实际应用中,经常根据遇到使用汇编语言子程序来实现,其中还发涉及到参数传递方法。可以应用寄存器、堆栈、变量来进行,调用子程序的入口参数和调用子程序后的出口参数。
如:编写一程序,将3个8位有符号数中的最大值存入MAX单元中。
分析:编制一个求两个数中最大值的过程,然后对其进行调用;由于程序中的数是符号数,所以,比较后的转移指令应该采用JL或JG。
分析下面各程序代码sy08_1.ASM,掌握汇编子程序的设计与调用。
Data segment
A db 0f1h
B db 12h
C db 7fh
Max db ?
Data ends
Stack segment para 'stack'
Stapn dw 20 dup(?)
Top EQU length stapn ;length的用法:length 变量名 。作用是返回利用dup定义的数组中的元素个数,即重复操作符dup前的count值。
Stack ends
Code segment
Assume cs:code ,ds:data,ss:stack
Main proc far
Start: push ds
Mov ax,0
Push ax
Mov ax,data
Mov ds,ax
Mov ax,stack
Mov ss,ax
Mov sp,top
Mov ah,a
Mov al,b
Call maxf
Mov al,c
Call maxf
Mov max,ah
Ret
Main endp
;子程序名为MAXF。功能:求两个数中 较大者
;入口参数:AH,AL=2个有符号数
;出口参数:较大者在AH中,较小者在AL中
Maxf proc near
Cmp ah,al
Jg next
Xchg ah,al
Next:ret
Maxf endp
Code ends
End start
四、实验内容
1、调试下面的程序 sy08_2.ASM,并给各语句增加注释
DATA SEGMENT
DT1 DW 1234H,5678H,90ABH,0BCDEH
CNT EQU ($-DT1) /2
DATA ENDS
STACK1 SEGMENT PARA STACK
STK DW 20 DUP(?)
STKCNT EQU LENGTH STK
STACK1 ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK1
START:
MOV AX,DATA
MOV DS,AX
MOV AX,STACK1
MOV SS,AX
MOV SP,STKCNT
MOV CX,CNT
LEA SI,DT1
LOP:
PUSH [SI]
ADD SI,2
LOOP LOP
POP AX
POP BX
POP CX
POP DX
MOV AH,4CH
INT 21H
CODE ENDS
END START
2、请编程程序实现求数据ARRAY中的最大值,以求最大值元素所在的位置,要求:最大值放在变量M中,最大值元素所在的位置放在变量INDEX中。请补充完整下面的程序sy08_3.ASM。
DATA SEGMENT
ARRAY DW 1234H,5678H,90ABH,0BCDEH,0ABCDH,6754H,3267H,8293H,5249H,0CBFEH,0CABEH
CNT EQU ($-ARRAY) /2
M DW ? ;用于保存数据中的最大值
INDEX DW ? ;保存数据中最大值所在的位置
DATA ENDS
STACK SEGMENT PARA STACK
STK DW 20 DUP(?)
STKCNT EQU LENGTH STK
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
;***************************************
;主程序
Main proc far
Start:
Mov ax,data
Mov ds,ax
Mov ax,stack
Mov ss,ax
;请补充语句
CALL Maxf
Mov AH,4CH
INT 21H
Main endp
; *************************************
;子程序
Maxf proc near
;请补充语句
RET
Maxf endp
;****************************************
3、作业提交
把完成后的sy08_1.ASM、sy08_2.ASM、sy08_3.ASM提交。
最后
以上就是纯真爆米花为你收集整理的子程序设计的全部内容,希望文章能够帮你解决子程序设计所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复