我是靠谱客的博主 纯真爆米花,最近开发中收集的这篇文章主要介绍子程序设计,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

上机实验08  子程序设计

知识提要:

  1. 掌握子程序的定义语句;

过程名  PROC  [near/far]

   过程体

RET

过程名  ENDP

其中过程名的命名方法与变量名相同,同一源程序中不能有相同的过程名.PROC为过程定义开始的伪指令,ENDP为过程定义结束伪指令,且PROC-ENDP必须配对使用。配对的PROC-ENDP前面的过程名应相同。NEAR/FAR定义了过程的属性,前者表示所定义的过程只能被相同代码段的程序调用,称为段内调用;而后者所表示的过程只能被不同代码段的程序调用,称为段间远调用。

2.子程序结构形式

一个完整的子程序一般应包含下列内容:

  1. )子程序的说明部分

在设计了程序时,要建立子程序的文档说明,使用户能清楚此子程序的功能和调用方法.说明时,应含如下内容:

.子程序名:命名时要见名知意.

.子程序的功能:说明子程序完成的任务;

.子程序入口参数:说明子程序运行所需参数及存放位置;

.子程序出口参数:说明子程序运行结果的参数及存放位置;

.子程序所占用的寄存器和工作单元;

.子程序调用示例;

 

  1. )掌握子程序的调用与返回

在汇编语言中,子程序的调用用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. 寄存器传递参数

    这种方式是最基本的参数传递方式。即 主程序调用子程序前,将入口参数送到约定的寄存器中。子程序可以直接从这些寄存器中取出参数进行加工处理,并将结果也放在约定的寄存器中,然后返回主程序,主程序再从寄存器中取出结果。

  1. 存储器单元传(变量)递参数

 这种方法是在主程序调用子程序前,将入口参数存放到约定的存储单元中;子程序运行时到约定存储位置读取参数;子程序执行结束后将结果也放在约定存储单元中。

  1. 用堆栈传递参数

利用共享堆栈区,来传递参数是重要的的方法之一。主程序将子程序的入口参数压入堆栈,子程序从堆栈中依次取出这些参数;经过子程序处理后,子程序将出口参数压入堆栈,返回主程序后再通过出栈获取它们。

 

一、实验要求和目的

   

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提交。

 

最后

以上就是纯真爆米花为你收集整理的子程序设计的全部内容,希望文章能够帮你解决子程序设计所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(44)

评论列表共有 0 条评论

立即
投稿
返回
顶部