汇编最后一次实验(给定两个数组,以十六进制的方式输出其中的最大值)

            刚学了汇编的子程序调用,和宏的使用,下面以本次上级实验内容体验一下

    题目:以十六进制的方式输出给定数组中的最大值

    要求:使用子程

;功能:给东两个数组,以十六进制的形式输出其中的最大值
 ;作者: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
      


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值