汇编语言实现将数据从大到小排序,要求:文本读入数据1000个整数 急急急

汇编语言实现将数据从大到小排序
要求:文本读入数据1000个整数

将读取的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