用汇编编写一个从键盘上输入并排序的程序
data segment
shuzi_w db 0
key DW 100 dup(0) ;输入的数的存放位置
buffer dw 0 ;输入数字的暂存位置 输入的数字大于10 需要缓冲
n db 1 ; 总共输入的数字个数 注意从1开始 loop循环原因
n1 db 1
pkey db 'the programmer has been done ..' ,0dh,0ah,24h
string db 'please input data: ',0dh,0ah,24h
string1 db 0dh,0dh,0dh,0dh,'output: ',0dh,0ah,'$'
kongge db 0dh, 0ah,24h
data ends
stack segment
dw 128 dup(0)
stack ends
code segment
assume cs:code,ds:data,ss:stack
start:
xor ax,ax
push ax
mov ax, data
mov ds, ax
mov es, ax
lea dx , string
mov ah, 09h
int 21h ;显示请输入数据
mov di , offset key
mov ax , 0
mov buffer,ax
biaohao1: ;程序输入处
mov ah,08h ;键盘输入但不显示
int 21h ; 输入保存在AL中
cmp al,0dh; 输入是回车,直接结束输入
jz biaohao4
cmp al,'0' ;当输入的数在0到9中间时 输入的是ASCII码
jb biaohao2 ;不跳转否则跳转
cmp al,'9'
ja biaohao2
;若输入的数在0到9之间时
mov ah,2
mov dl,al ;显示此数
int 21h
sub al,30h
mov ah,0
push ax ; 保存刚输入的数字
mov bx,buffer
mov ax,10
mul bx ;ax=10*buffer
pop bx ; 将上面保存的ax 的值给bx
add ax,bx ;ax=10*buffer+bx(之前的ax) 输入的数字大于10
mov buffer,ax ;将ax 的值给buf
mov [di],ax ;若输入11,循环第一次输入是1,第二次重输入12
jmp biaohao1; 输入大于10 的数字的下一位
biaohao2: ;输入数字不是0到9
cmp al,20h ;输入是否是空格
je biaohao3 ;是的话跳出循环
jmp biaohao1 ; 不是的话继续输入下一位
biaohao3: ;是空格表示输入下一个数字
call konggexianshi ;屏幕上显示空格
add di,2 ;修改di指针,输入下一个数字
inc n ;输入的数字个数加一
mov ax,0
mov buffer,ax ;初始化
jmp biaohao1;继续输入下一个数字
biaohao4:
mov al,n
cmp al,0
jz qw ;没有输入数字就直接回车,结束程序
call konggexianshi
call paixu
push dx
push ax
lea dx,string1
mov ah ,09h
int 21h
pop ax
pop dx
mov cx,0
mov cl, n
mov bx,offset key
disp: mov dx,0; 初始化
mov ax,[bx]
call shujuxianshi
call konggexianshi
inc bx
inc bx
loop disp
qw:
call konggexianshi
lea dx, pkey
mov ah, 9
int 21h ; output string at ds:dx
mov ah, 1
int 21h
mov ax, 4c00h ; exit to operating system.
int 21h
;功能:从小到大排序
;入口参数为key的数组,和数组长度n,返回值为堆栈的数
paixu proc near
mov al,n
mov n1,al; 外循环、
loop1:
mov cl,n
mov ch,0;内循环
dec cx
mov bx,offset key
loop2:
mov ax,[bx]
cmp ax,[bx+2]
jna loop3 ;ax不大于bx+2,不交换
push ax
mov ax,[bx+2]
mov [bx],ax
pop ax
mov [bx+2],ax
loop3:
add bx,2
loop loop2
dec n1
jz paixuend
jmp loop1
paixuend:
ret
paixu endp
;功能:空格显示,
;入口参数为kongge的字符串,无返回值
konggexianshi proc near
push ax
push dx
mov ah,09
mov dx ,offset kongge
int 21h
pop dx
pop ax
ret
konggexianshi endp
;功能:显示单个位数。
;入口参数为AL,显示AL的值,无返回值
xianshidangeshuzi proc near
push dx
push ax
mov dx,0
mov dl,al
xor ax,ax
mov ah,02h
int 21h
pop ax
pop dx
ret
xianshidangeshuzi endp
;功能:数据显示,可以显示5位数的十进制数。
;入口参数为AX,无返回值
shujuxianshi proc near
push cx
push ds
mov cx,10000
div cx
push dx ;保存余数
mov shuzi_w,al ;万位数
cmp shuzi_w,0
je j1
add al,30h
call xianshidangeshuzi
j1:
pop ax;取余数
mov dx,0
mov cx,1000
div cx
push dx;保存余数
mov shuzi_w,al ;千位数
cmp shuzi_w,0
je j2
add al,30h
call xianshidangeshuzi
j2:
pop ax;取余数
mov dx,0
mov cx,100
div cx
push dx;保存余数
mov shuzi_w,al ;百位数
cmp shuzi_w,0
je j3
add al,30h
call xianshidangeshuzi
j3:
pop ax;取余数
mov dx,0
mov cx,10
div cx
push dx;保存余数
mov shuzi_w,al ;十位数
cmp shuzi_w,0
je j4
add al,30h
call xianshidangeshuzi
j4:
pop dx
add dl,30h
mov al,dl
call xianshidangeshuzi
xor ax,ax ;初始化
mov shuzi_w,al ;个位数
pop ds
pop cx
ret
shujuxianshi endp
ends
end start