四、实验内容
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