汇编语言获取数组的最大值最小值

题目要求

       从键盘输入一组任意数,利用逐次比较方法。设置两个变量maxay和minay存放最大和最小值。要求能找到这两个存储单元并看到最大和最小值。把最大和最小数显示到屏幕上。

代码设计

       首先要通过键盘进行输入操作,输入的数据可正可负,由于数据为16位的dw,故而数值有着取值范围,需要对其输入进行限定。在输入时通过空格“ ”作为分隔符,每一段代表一个完整的数据,由于每次只能输入一位,故而需要在结束之前,对数据的数据进行计算相加取结果,每新输入一位就要对之前记录的数据进行*10操作,再加上新的数据。由于输入的数据有两类,正数和负数,故而需要根据输入时是否有“-”号来作为标记(设置标识符flag),每次完成输入后重置。由于输入的为数字,故而只有“-”和数字有效,可以通过ASCII码进行限制

       在第一个完整数据输入完成后,保存其数值,对maxay 和minay进行初始化,以后的每一个完整数据输入完成后,都与maxay和minay进行分级比较,进行数据的更新操作。数据输入结束(即输出数组最大值和最小值)的标志为回车符,当按下回车后,输出结果。由于要一直输入字符,故而需要使用循环操作。

       在结果输出时,要保证其为10进制,可以通过除法对存储的数据进行分割(除10),一个字符一个符的输出,实现十进制格式的数据输出。

运行结果

图1 运行结果展示

 

代码

DATAS SEGMENT
    ;此处输入数据段代码 
    CRLF DB 0AH,0DH,"$";回车换行
    ;array dw 10
    ;假设一个数组,其中头个数据10表示元素个数
	;array dw 11,-3,0,20,900,587,-632,777,234,-34,-56
	number dw 0
	F DB 0
    ;这是一个有符号字量元素组成的数组
    maxay dw ?	;存放最大值
    minay dw ?	;存放最小值
    flag dw 0    ;输入数的正负标记,0为正,1为负
    startflag dw 0    ;开始标识符,初始化maxay和minay,作为比较标识符,为1开始比较
    MSG0 DB 'INPUT:$'
    MSG1 DB 'RESULT:$'
    MSG2 DB 0DH,0AH,'ERROR',0DH,0AH,'$'
    MSG3 DB 0DH,0AH,'MORE THAN 65535',0DH,0AH,'$'
    STRING1 DB 'The max number is:','$'
    STRING2 DB 0DH,0AH,'The min number is:','$'
DATAS ENDS
 
STACKS SEGMENT
    ;此处输入堆栈段代码
STACKS ENDS
 
CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,DATAS
    MOV DS,AX
again:
    mov number,0    ;输入一位数字
    LEA SI,number
    CALL READ10    ;组合数字
   
	mov ax,number    ;获取组合的数字
	;如果是第一个数字,则初始化maxay和minay
    cmp startflag,0
    JZ initMaxMin
      
	cmp flag,1    ;根据标识判断是否为负
	jz MINUS    ;以负数进行接下来的比较大小
	jmp compare    ;以正数比较大小
	 
    MOV AH,4CH
    INT 21H
    
;循环输入数组元素,根据标识判断正负
READ10 PROC NEAR
    XOR DX,DX
    MOV BX,10
RD0:
     MOV AH,1
     INT 21H
     CMP AL,' ' ;单个输入结束
     JZ RT0
     CMP AL,13  ;输入回车结束
     JZ RT4
     CMP AL,'-'
     JZ RT5    ;设置标识符
     CMP AL,'0' ;不能输入小于'0'的字符
     JB RE
     CMP AL,'9' ;不能输入大于'9'的字符
     JNBE RE
     AND AX,0FH  ;将AH清零
     XCHG AX,[SI]
     MUL BX      ;将前一位数字乘十和下一位数字相加
     JC RE1      ;检查溢出,超过65535
     ADD AX,[SI]
     JC RE1
     XCHG AX,[SI]
     JMP RD0 
RE1:       ;溢出处理,显示MORE THAN 65535
     MOV F,1    
     LEA DX,MSG3
     MOV AH,9
     INT 21H
     JMP RT0
RE:        ;输入的不是阿拉伯数字,显示ERROR
     MOV F,1
     LEA DX,MSG2
     MOV AH,9
     INT 21H
RT4:
     LEA DX,STRING1     ;输出提示2
     MOV AH,09H
     INT 21H
     mov ax,maxay
     call symoutput
     LEA DX,STRING2     ;输出提示2
     MOV AH,09H
     INT 21H
     mov ax,minay
     call symoutput
     lea dx,crlf    ;换行
	 mov ah,9
	 int 21h  
RT0:
     RET
RT5:
    mov flag,1
    jmp again
READ10 ENDP

MINUS:
    NEG ax    ;将组合数在寄存器ax中变为负数
    ;更新maxay和minay
    ;jmp compare    ;进行比较和数值更新
compare:
    mov flag,0    ;恢复标识
    cmp maxay,ax
    js updateMaxay
    cmp ax,minay
    js updateMinay
	jmp again
updateMaxay:
    mov maxay,ax
    cmp ax,minay
    js updateMinay
	jmp again
updateMinay:
    mov minay,ax
	jmp again
initMaxMin:
    mov startflag,1
    cmp flag,1    ;1为负数
    jz initMaxMin_
    mov maxay,ax
    mov minay,ax
    jmp again
initMaxMin_:
    mov flag,0
    NEG ax
    mov maxay,ax
    mov minay,ax
    jmp again
    
;有符号数的输出,入口参数为ax
symoutput proc
	push bx;入栈保存
	push dx
	
	mov bx,ax;保存数据防止后续修改,可直接调用函数
	
	cmp ax,0;比较ax中数字的正负
	js negative;负数的输出
	jz zero;输出0
	jns positive;正数的输出
		
negative:
	mov dl,'-';输出负号
	mov ah,2
	int 21h
	
	neg bx;求补数
	call output
	jmp symoutputover 
	
zero:
    mov dl,30H
    mov AH,02H    ;调用2号中断
    INT 21H
    ;jmp symoutputover  

positive:
	call output
	
symoutputover:
	pop dx;出栈复原
	pop bx
	ret
symoutput endp
 
;多位输出函数,入口参数为bx
output proc
	push ax;数据入栈区
	push cx
	push dx
	
	;初始化变量
	mov ax,bx;数据放入准备除法
	mov cl,10;作为除数
	mov ch,0;用于计数便于后续出栈输出
divagain:;除法数字剥离部分
	cmp ax,0;判断是否已经除尽
	je divover
	inc ch;计数器加1
	div cl
	push ax;入栈,提取的时候取用ah部分,存储余数(低位优先)
	mov ah,0;调整ax
	jmp divagain;再次除法剥离数字
divover:;出栈输出部分
	cmp ch,0;判断数字是否已经出尽
	je outputover
	pop ax;取用ah部分
	mov dl,ah;输出部分
	add dl,48
	mov ah,2
	int 21h
	dec ch
	jmp divover 
		
outputover:;收尾部分
	pop dx
	pop cx
	pop ax;数据出栈区
	ret
output endp
CODES ENDS
    END START
  • 3
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值