要求:编程实现排序算法,对某txt格式文件中的无符号整数(0~32767)进行排序,排序结果输出到屏幕。数据的个数不超过1024,emu8086模拟速度较慢,测试数据个数可减少。输入和输出文件中的数可自由选择按空格、回车或制表符分割。
; you may customize this and other start-up templates;
; the location of this template is c:\emu8086\inc\0_com_template.txt
data segment
file db 'test.txt'
num dw 1024 dup (0)
buffer db 2000 dup (0)
data ends
code segment
assume ds:data, cs:code
start:
mov ax, data
mov ds, ax
mov es, ax
;打开文件test.txt
mov ah,3dh
lea dx,file
mov al,0
int 21h
;读取文件内容,存入buffer
lea dx,buffer
mov bx,ax ;文件代号
mov cx,100 ;读取的字节数
mov ah,3fh
int 21h
;显示buffer中的内容
push ax
mov cx,ax
lea si,buffer
next:
mov dl,[si]
mov ah,2
int 21h
inc si
loop next
mov dl, 0dh ;回车
mov ah, 2
int 21h
mov dl, 0ah ;换行
int 21h
;关闭被读取的文件
mov ah,3eh
int 21h
;提取buffer中数字到num中
pop ax
mov cx,ax ;实际读到的字节数目
lea si,buffer
lea di,num
mov bx,0 ;存放当前数值
cld
loop1:
mov dl,[si]
cmp dl,' '
push dx
jz loop2
cmp dl,13
jz loop2
mov ax,10 ;10进制乘数,16位乘法
mul bx ;16位乘法
mov bx,ax ;由于本题的限制,只要低16位即可
pop dx
sub dl,30h ;从ascii变回数值
mov al,dl
cbw
mov dx,ax
add bx,dx
jmp flag
loop2:
mov ax,bx
stosw ;将内容存到num中
mov bx,0
space:
inc si
mov dl,[si]
cmp dl,'0'
jl space
sub si,1
flag:
inc si
loop loop1
sub di,2
push di ;num结束地址
;将num中的数排序
lea si,num
push si
sort1:
pop bx
pop ax
cmp ax,bx
push ax
jz sort1end
add bx,2
push bx
mov di,si
sort2:
pop bx
pop ax
cmp ax,di
push ax
push bx
jz sort1
mov ax,[di]
add di,2
mov bx,[di]
cmp ax,bx
ja swap
jmp sort2
swap:
mov cx,ax
mov ax,bx
mov bx,cx
push di
cld
sub di,2
stosw
mov ax,bx
stosw
pop di
jmp sort2
sort1end:
;output num
lea di,num
loop3:
mov bx,0 ;高位0标记
mov ax, [di] ;索引数组元素
mov dx, 0 ;令高位为0
mov cx, 10000
div cx
push dx
mov dx, ax
add dx, 30h ;转化成ascii码
mov ah, 2 ;设置 int输出dl中字符
cmp bx,0
ja not01
cmp dl, 30h
jz zero1 ;万位为0则不输出
not01:
int 21h ;输出万位
mov bx,1
zero1:
pop dx
mov ax,dx ;余数放在ax中
mov dx, 0 ;令高位为0
mov cx, 1000
div cx
push dx
mov dx, ax
add dx, 30h ;转化成ascii码
mov ah, 2 ;设置int输出dl中字符
cmp bx,0
ja not02
cmp dl, 30h
jz zero2 ;千位为0则不输出
not02:
int 21h ;输出千位
mov bx,1
zero2:
pop dx
mov ax,dx ;余数放在ax中
mov dx, 0 ;令高位为0
mov cx, 100
div cx
push dx
mov dx, ax
add dx, 30h ;转化成ascii码
mov ah, 2 ;设置int输出dl中字符
cmp bx,0
ja not03
cmp dl, 30h
jz zero3 ;百位为0则不输出
not03:
int 21h ;输出百位
mov bx,1
zero3:
pop dx
mov ax,dx ;余数放在ax中
mov dx, 0 ;令高位为0
mov cx, 10
div cx
push dx
mov dx, ax
add dx, 30h ;转化成ascii码
mov ah, 2 ;设置int输出dl中字符
cmp bx,0
ja not04
cmp dl, 30h
jz zero4 ;十位为0则不输出
not04:
int 21h ;输出十位
mov bx,1
zero4:
pop dx
mov ax,dx ;余数放在ax中
mov dx, 0 ;令高位为0
mov cx, 1
div cx
mov dx, ax
add dx, 30h ;转化成ascii码
mov ah, 2 ;设置int输出dl中字符
cmp dl, 30h
int 21h ;输出个位
add di,2
;inc bx
;cmp bx, cx
mov dl, 0dh ;回车
mov ah, 2
int 21h
mov dl, 0ah ;换行
int 21h
pop ax
mov bx,ax
add bx,2
cmp bx,di ;判断是否结束
push ax
jnz loop3
;程序结束,返回到操作系统系统
mov ax, 4c00h
int 21h
end start
code ends
ret