题目要求
从键盘输入一组任意数,利用逐次比较方法。设置两个变量maxay和minay存放最大和最小值。要求能找到这两个存储单元并看到最大和最小值。把最大和最小数显示到屏幕上。
代码设计
首先要通过键盘进行输入操作,输入的数据可正可负,由于数据为16位的dw,故而数值有着取值范围,需要对其输入进行限定。在输入时通过空格“ ”作为分隔符,每一段代表一个完整的数据,由于每次只能输入一位,故而需要在结束之前,对数据的数据进行计算相加取结果,每新输入一位就要对之前记录的数据进行*10操作,再加上新的数据。由于输入的数据有两类,正数和负数,故而需要根据输入时是否有“-”号来作为标记(设置标识符flag),每次完成输入后重置。由于输入的为数字,故而只有“-”和数字有效,可以通过ASCII码进行限制
在第一个完整数据输入完成后,保存其数值,对maxay 和minay进行初始化,以后的每一个完整数据输入完成后,都与maxay和minay进行分级比较,进行数据的更新操作。数据输入结束(即输出数组最大值和最小值)的标志为回车符,当按下回车后,输出结果。由于要一直输入字符,故而需要使用循环操作。
在结果输出时,要保证其为10进制,可以通过除法对存储的数据进行分割(除10),一个字符一个符的输出,实现十进制格式的数据输出。
运行结果
![](https://img-blog.csdnimg.cn/cc3b3698cb084c219a03f1341eefc359.png)
代码
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