通过调用子程序,实现从键盘输入10个带符号字节数据,将其从小到大排序,并将结果在显示器上以十进制形式显示输出。
data segment
ary db 10 dup(0) ;用于存放输入数据
count db 10
x db '-' ;x存放'-',后面用于判断
sfn db 0 ;标识,用于判断是否输入负数
mess1 db 'Input :','$'
mess2 db 0ah,0dh,'Output :$';0ah和0dh是换行和回车
data ends
stack segment
db 100 dup(?)
stack ends
code segment
assume ds:data,cs:code,ss:stack
start:
mov ax,data
mov ds,ax
call cin
call sort
call cout
mov ah,4ch
int 21h
cin proc near ;输入
push ax
push bx
push cx
push dx
push si
lea si,ary
mov cl,count
cinlop:
lea dx,mess1
mov ah,9;显示信息:"Input :"
int 21h
input:
mov ah,1 ;输入
int 21h
mov bl,al
cmp bl,x ;判断是否为负数
je equal ;将sfn赋值为1
cmp bl,0dh ;判断输入是否结束
jz retu ;退出输入
mov bh,0
sub al,30h
mov bh,al
xor bl,bl
mov bl,0ah
sub al,al
mov al,[si] ;对原来的数乘10
mul bl
mov ah,[si]
sub [si],ah ;将原来的数清除,否则会出现累加错误
add [si],al ;存入[si]中
add [si],bh
jmp input
retu:
cmp sfn,1 ;如果sfn为1,则将[si]中的数取为相反数
jz reset
retub:
mov sfn,0 ;将sfn重置为0,实现下一次的赋值判断
inc si ;数组指针下移
loop cinlop
jmp exit
reset:
mov al,[si]
neg al
mov [si],al
jmp retub
equal:
mov sfn,1
jmp input ;返回input主程序,并重新输入
exit:
pop si
pop dx
pop cx
pop bx
pop ax
ret
cin endp
cout proc near
push ax
push bx
push cx
push dx
push si
lea si,ary
xor cx,cx
mov bh,count
mov cl,bh
coutp:
mov bh,cl
lea dx,mess2
mov ah,9 ;显示信息:"Output :"
int 21h
mov al,[si]
cmp al,0
jl exch ;判断要输出的数据是否为负
judge:
mov dl,al
sub cx,cx
mov cx,1 ;计数,初始为1
mov bl,10 ;每次除10
print:
mov ah,0 ;清零
mov al,dl
div bl ;除10
push ax ;入栈
cmp al,0
jle endl
mov dl,al
inc cx
jmp print
endl:
pop dx
xchg dh,dl ;余数转入dl
add dl,30h
mov ah,2
int 21h
loop endl
inc si
mov cl,bh
loop coutp
jmp exit1
exch:
mov dl,x
mov ah,2
int 21h
mov al,[si] ;将[si]中的值重新赋值给al,否则会出错
neg al
jmp judge
exit1:
pop si
pop dx
pop cx
pop bx
pop ax
ret
cout endp
sort proc near ;该子程序实现数组排序
push ax
push bx
push cx
push dx
push si
push di
mov cl,count
dec cl ;外层循环次数为总数组数-1
;lea bx,ary ;也可以尝试使用bx作为变址
mov si,0
mov di,0
lp1:
push cx
mov cl,count
dec cl
xor ch,ch
sub cx,si
mov di,0
lp2:
mov al,ary[di]
mov ah,ary[di+1]
;mov al,[bx+di]
;mov ah,[bx+di+1]
cmp al,ah
jle exit2
;mov al,[bx+di+1]
;mov ah,[bx+di]
xchg ah,al ;该语句可以实现上面两条语句功能
mov ary[di+1],ah
mov ary[di],al
;mov [di+1],ah
;mov [di],ah
exit2:
inc di
loop lp2
pop cx
inc si ;随着外层循环增加,内存循环次数减少
loop lp1
pop di
pop si
pop dx
pop cx
pop bx
pop ax
ret
sort endp
code ends
end start
实验测试:
参考文章:1、实现单个数据的键盘输入输出
2、汇编排序算法小结