刚学了汇编的子程序调用,和宏的使用,下面以本次上级实验内容体验一下
题目:以十六进制的方式输出给定数组中的最大值
要求:使用子程序
;功能:给东两个数组,以十六进制的形式输出其中的最大值
;作者:KDF5000
;时间:2012.11.24
.386
;定义一个输出任意进制的数,宏NUM为要转的数,N为进制
OUTNUM MACRO NUM,N
LOCAL L1,O1,NEXT2
MOV AX,NUM
MOV DX,0
MOV CX,N ;设置除数
MOV SI,OFFSET TS
L1: DIV CX
CMP DX,9 ;判断是不是大于9,十六进制时有用
JA O
ADD DX,30H ;小于9加30h
JMP NEXT2
O1: ADD DX,37H ;大于9加37H
NEXT2: DEC SI
MOV [SI],DL
MOV DX,0
CMP AX,0
JNE L1
MOV DX,SI
MOV AH,9
INT 21H
ENDM
;定义一个求数组中最大数的宏 ARRAY为数组的偏移地址SIZE为数组的长度,结果在AX中
MAXNUM MACRO ARRAY,SIZE
LOCAL LOP1,NEXT3
LEA SI,ARRAY
MOV CX,SIZE-1
MOV AL,[SI]
LOP1: INC SI
CMP [SI],AL
JBE NEXT3
MOV AL,[SI]
NEXT3:
LOOP LOP1
MOV AH,0
ENDM
DATA SEGMENT USE16
BUF DB 11,5,20,13,32
COUNT1 = $-BUF
BUF1 DB 7,0,64,23,35
COUNT2 =$-BUF1
DB 8 DUP('$')
TS DB 'H$'
MESSAGE1 DB 0DH,0AH,'数组1以最大的数为:',0DH,0AH,'$'
MESSAGE2 DB 0DH,0AH,'数组2的最大数为:',0DH,0AH,'$'
MES DB 0DH,0AH,'下面以宏调用的方式输出结果',0DH,0AH,'$'
HUANHANG DB 0DH,0AH,'$'
DATA ENDS
STACK SEGMENT USE16 STACK
DB 200 DUP(0)
STACK ENDS
CODE SEGMENT USE16
ASSUME DS:DATA,CS:CODE,SS;STACK
BEGIN:MOV AX,DATA
MOV DS,AX
;找第一个数组中的最大数
LEA SI,BUF
MOV CX,COUNT1-1
;调用输出数组最大数的子程序
CALL MAXNUMBER
;输出十六进制数
CALL OUTH
;输出提示信息
LEA DX,MESSAGE1
MOV AH,9
INT 21H
;输出转换后的数
MOV DX,SI
MOV AH,9
INT 21H
;找第二个数组中的最大数
LEA SI,BUF1
MOV CX,COUNT2-1
CALL MAXNUMBER
CALL OUTH
;输出提示信息
LEA DX,MESSAGE2
MOV AH,9
INT 21H
;输出转换后的数
MOV DX,SI
MOV AH,9
INT 21H
;下面以宏调用的方式输出结果
LEA DX,MES
MOV AH,9
INT 21H
LEA DX,MESSAGE1
MOV AH,9
INT 21H
MAXNUM BUF,COUNT1
OUTNUM AX,16
LEA DX,MESSAGE2
MOV AH,9
INT 21H
MAXNUM BUF1,COUNT2
OUTNUM AX,16
MOV AH,4CH
INT 21H
;找出数组中的最大数 入口参数:SI存放数组(字节存放)首地址,CX存放数组长度减1,
MAXNUMBER PROC
MOV AL,[SI]
LOP: INC SI
CMP [SI],AL
JBE NEXT
MOV AL,[SI]
NEXT:
LOOP LOP
MOV AH,0
RET
ENDP
; 以十六进制输出,入口参数,AX存放要输出的数,输出结果存放在以SI为首偏移地址的存储区
OUTH PROC
MOV DX,0
MOV CX,16 ;设置除数
MOV SI,OFFSET TS
L: DIV CX
CMP DX,9 ;判断是不是大于9,十六进制时有用
JA O
ADD DX,30H ;小于9加30h
JMP NEXT1
O: ADD DX,37H ;大于9加37H
NEXT1: DEC SI
MOV [SI],DL
MOV DX,0
CMP AX,0
JNE L
RET
ENDP
CODE ENDS
END BEGIN