work3.asm
来自「本人的汇编上机的简单的小程序」· 汇编 代码 · 共 163 行
ASM
163 行
data segment
buf db 4
db ?
db 4 dup(?)
num dw 20 dup(?)
len dw 20 dup(?)
var dw ?
n dw ?
flag db 0
ten db 10
tenW dw 10
tip1 db "Input 20 numbers(with Enter to end): ",0ah,0dh,'$'
tip2 db "The ascending order: ",0ah,0dh,'$'
tip3 db "Out of range,input again:(0~999): $"
data ends
stack1 segment para stack
dw 20h dup(0)
stack1 ends
code segment
assume cs:code, ds:data, ss:stack1
start:
mov ax,data
mov ds,ax
mov dx,offset tip1 ;提示语
mov ah,09h
int 21h
;..............20个数字的输入................
mov cx,20
mov n,0
input:push cx
call inp
mov dx,0 ;数值位数计数器
mov var,0
mov flag,0
push cx
sub cx,1
jcxz en
lop1: ;将输入字符串的ASC转为数值
lea bx,buf+2
add bx,dx
mov al,[bx]
mov ah,0
sub ax,30h
mov bx,var
add ax,bx
mul ten
mov var,ax
inc dx ;降一位
loop lop1
en: pop cx ;获取数值的个位
mov bx,n
mov len[bx],cx
dec cx
lea bx,buf+2
add bx,cx
mov cl,[bx] ;个位存于cx
sub cl,30h
mov ch,0
mov bx,var ;百十位移到bx
add bx,cx ;百十位于个位相加
mov cx,bx ;结果存入cx
mov bx,n
mov num[bx],cx ;将输入数值顺序存入num的连续空间
add n,2
pop cx
loop input
;.............................................................
;......................冒泡排序...............................
mov cx,19
loop1:
push cx
mov bx,0
loop2:
mov ax,num[bx]
cmp ax,num[bx+2]
jbe next
xchg ax,num[bx+2]
mov num[bx],ax
mov ax,len[bx]
xchg ax,len[bx+2]
mov len[bx],ax
next:
add bx,2
dec cx
jne loop2
pop cx
loop loop1
;.............................................................
mov dx,offset tip2 ;提示语
mov ah,09h
int 21h
;......................排序后数值的显示.......................
mov cx,20
mov n,0
output: push cx
mov bx,n
mov ax,num[bx]
mov cx,len[bx]
mov dx,0
lop2: div tenW
add dl,30h
push dx
mov dx,0
loop lop2
mov cx,len[bx]
mov flag,0
lop3: pop dx
cmp dl,30h
jne go ;输入不为0则输出
cmp flag,4 ;没有无效0则输出
je go
inc flag
mov ax,len[bx]
cmp flag,al ;如果全0则要输出1个0
je go
jmp J ;如果输入在百位或十位有无效0则不输出
go: mov flag,4 ;已经将无效0输出完
mov ah,02h
int 21h
J: loop lop3
mov dl,20h ;空格
mov ah,02h
int 21h
add n,2
pop cx
loop output
;.............................................................
mov ah,4ch
int 21h
;.............................................................
inp proc
jmp q
re: mov dx,offset tip3 ;提示语
mov ah,09h
int 21h
q: lea dx,buf ;数字的输入
mov ah,0ah
int 21h
mov dl,0ah ;换行
mov ah,02h
int 21h
mov dl,0dh
mov ah,02h
int 21h
mov cl,buf+1 ;获取输入字符长度
mov ch,0
lea bx,buf+2
add bx,cx
mov byte ptr [bx],'$' ;将输入最后的0DH变为$
lea bx,buf+2
L: cmp buf[bx],30h
jb re
cmp buf[bx],39h
ja re
inc bx
cmp buf[bx],24h
jne L
ret
inp endp
code ends
end start
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?