夜竹 2019-03-26 11:13 采纳率: 100%
浏览 1045
已采纳

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

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

  • 写回答

1条回答 默认 最新

  • a81836620 2019-03-26 12:58
    关注

    将读取的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
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器