题目:在缓冲区中输入20字符,然后按ASCII值从大到小的顺序排列并显示出来。
要求:
(1)显示时每个字符间隔一个空格;
(2)换行后再将其中的数字按序显示出来。
data segment
STRING db 256 dup('$')
space db ' ', '$' ;定义空格
CRLF db 0ah, 0dh, '$' ;定义回车换行
data ends
code segment
assume ds:data,cs:code
start:
mov ax,data
mov ds,ax
mov dx,0 ;存储元素个数
mov bx,0
lea di,STRING ;看成数组角标
input:
mov ah,01h ;单字符输入
int 21h
cmp al,0dh
je again ;判断回车符
mov [di],al ;存入数组
inc di
inc dx
inc bx
jmp input
again: ;外层循环
mov cx,dx
sub cx,1
lea si,STRING
i0: ;内层循环
mov al,[si]
cmp al,[si+1]
jae next ;大于等于则next,小于则交换
xchg al,[si+1]
mov [si],al
next:
inc si
loop i0 ;一直朝地址高的方向进行冒泡排序
dec DX
cmp DX,1
jne again
call print ;调用输出函数
mov dx, offset CRLF ;输出回车换行符
mov ah, 09h
int 21h
mov cx,bx
lea si,STRING
i3: cmp byte ptr [si],30H ;逐个判断是否是数字
ja i2
cmp byte ptr [si],39H
jb i2
mov dl,[si] ;输出数字
mov ah,02H
int 21h
mov dx,offset space ;输出空格
mov ah,09h
int 21h
inc si
loop i3
mov ah,4cH ;程序结束
int 21h
i2:
inc si
loop i3
mov ah,4cH
int 21h
print:
lea si,STRING
mov cx,bx
i1:
mov dl,[si]
mov ah,02H
int 21H
mov dx,offset space
mov ah,09H
int 21H
inc si
loop i1
ret
code ends
end start