从键盘输入一个以回车结束的十进制数字串(不超过20个)。
要求:
(1) 按ASCII码值的降序显示这个数字串中ASCII码值最大和最小的两个数字。
(2) 以十进制形式显示数字串中所有数字的和。
(3) 以十进制形式显示数字串中最大数与最小数的乘积。
(4) 对数字串进行处理,使每个字符在字符串中只出现一次。
(5) 数据的输入和结果的输出都要有必要的提示,且提示独占一行。
(6) 要使用到子程序。
data segment
str db 30,?,30 dup(?)
str2 db 10 dup(0)
m1 db 0ah,0ah,'input:',0ah,0dh,'$'
m2 db 0ah,0ah,'max and min',0ah,0dh,'$'
m3 db 0ah,0dh,'sum:',0ah,0dh,'$'
m4 db 0ah,0dh,'mul:',0ah,0dh,'$'
m5 db 0ah,0dh,'str:',0ah,0dh,'$'
m6 db 0ah,0dh,'max:',0ah,0dh,'$'
m7 db 0ah,0dh,'min:',0ah,0dh,'$'
max db '0';最大值的比较值
min db '9';最小值的比较值
data ends
stack segment
dw 10 dup(10)
stack ends
code segment
assume cs:code,ds:data,es:data
main proc far
start:
mov ax,data
mov ds,ax
mov es,ax
call input
call output1
call output2
call output3
call output4
mov ax,4c00h
int 21h
main endp
input proc near ;输入子程序
lea dx,m1
mov ah,09h
int 21h
lea dx,str
mov ah,0ah
int 21h
ret
output1 proc near;输出子程序1 最大值和最小值
lea dx,m2
mov ah,09h
int 21h
lea si,str+2
mov cl,str+1
mov ch,0
cld
l4:
lodsb
cmp al,max;进行比较求最大值
ja l1
cmp al,min;进行比较求最小值
jb l2
jmp l3
l1:
mov max,al
cmp al,min;防止出现2345升序的情况无法求最小值
jb l2
jmp l3
l2:
mov min,al
l3:
loop l4
lea dx,m6
mov ah,09h
int 21h
mov dl,max;输出最大值
mov ah,02h
int 21h
lea dx,m7
mov ah,09h
int 21h
mov dl,min;输出最小值
mov ah,02h
int 21h
ret
output2 proc near;输出子程序2 所有数字的和
lea dx,m3
mov ah,09h
int 21h
lea si,str+2
mov cl,str+1
mov ch,0
mov bl,0
mov dl,10
cld
t1:
lodsb
add bl,al;求所有数字的和
sub bl,30h
loop t1
mov cl,0
mov al,bl
t2:
mov ah,0
div dl
push ax;将余数压栈,方便输出
add cl,1
cmp al,0
jnz t2
t3:
pop ax;将余数出栈
mov dl,ah
add dl,30h
mov ah,02h
int 21h
loop t3
ret
output3 proc near;输出子程序3 最大值与最小值相乘
lea dx,m4
mov ah,09h
int 21h
lea si,str+2
mov cl,str+1
mov ch,0
mov bl,0
cld
n4:
lodsb
cmp al,max
ja n1
cmp al,min
jb n2
jmp n3
n1:
mov max,al
cmp al,min
jb n2
jmp n3
n2:
mov min,al
n3:
loop n4
mov al,max
mov bl,min
sub al,30h
sub bl,30h
mul bl;最大值与最小值相乘
mov dl,10
div dl;除10,将两位数分开
mov bh,ah
mov dl,al;输出十位
add dl,30h
mov ah,02h
int 21h
mov dl,bh;输出个位
add dl,30h
mov ah,02h
int 21h
ret
output4 proc near;输出子程序4 对数字串进行处理使每个字符只出现一次
lea dx,m5
mov ah,09h
int 21h
lea si,str+2
mov cl,str+1
mov ch,0
p4:
lodsb
mov ah,0
sub al,30h
mov bx,ax
add str2[bx],1;遇见一个数字,该数字对应的数组元素加一
cmp str2[bx],1; 不是第一个遇见的数字不进行输出
ja pe
mov ah,02h
mov dl,al
add dl,30h
int 21h
pe:
loop p4
ret
code ends
end start