汇编语言 从键盘输入一个以回车结束的十进制数字串(不超过20个)。

从键盘输入一个以回车结束的十进制数字串(不超过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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值