【8086】读取文件以及排序

要求:编程实现排序算法,对某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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值