上机实验08 子程序设计

四、实验内容

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

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值。Top的值是Stapn的大小,20。
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         ;把ax放入ss堆栈段寄存器底部地址
         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

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   ;STACK1中存的是16位立即数,偏移地址
          MOV SS,AX        ;立即数和段寄存器之间无法直接交换数据
          MOV SP,STKCNT   ;对战指针STKCNT的值是STK的大小,20.
          MOV CX,CNT      ;循环次数
          LEA SI,DT1      ;取有效地址到通用寄存器si 
     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

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
         MOV SP,STKCNT
         PUSH DS
         SUB AX,AX
         MOV CX,CNT
         LEA BX,ARRAY
         CALL Maxf
         Mov AH,4CH
         INT 21H
Main endp

Maxf proc near
LOP1:
         MOV AX,[BX]
         DEC CX
         INC BX
         CMP AX,[BX]
         JGE NEXT
         MOV AX,[BX]
         MOV DX,BX
NEXT:LOOP LOP1
          MOV M,AX
          MOV INDEX, DX
    RET
Maxf endp
Code ends
  End start

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值