[8086] read the file and sort

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

 

Guess you like

Origin blog.csdn.net/saber_jk/article/details/84865239