Requirements: Programming sorting algorithm, unsigned integer (0 to 32767) in a txt document format sorting sorts the output to the screen. Number does not exceed 1024, emu8086 slower simulation, the number of test data can be reduced. The number of input and output files can be freely selected by spaces, tabs, or carriage returns split.
; 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