work3.asm

来自「本人的汇编上机的简单的小程序」· 汇编 代码 · 共 163 行

ASM
163
字号
data segment
      buf db 4
          db ?
          db 4 dup(?)
      num dw 20 dup(?)
      len dw 20 dup(?)
      var dw ?
      n   dw ?
      flag db 0
      ten db 10
      tenW dw 10
      tip1 db "Input 20 numbers(with Enter to end): ",0ah,0dh,'$'
      tip2 db "The ascending order: ",0ah,0dh,'$'
      tip3 db "Out of range,input again:(0~999): $"
data ends
stack1 segment para stack
      dw 20h dup(0)
stack1 ends
code segment
      assume cs:code, ds:data, ss:stack1
start:
      mov ax,data
      mov ds,ax
      mov dx,offset tip1            ;提示语
      mov ah,09h
      int 21h
;..............20个数字的输入................
      mov cx,20
      mov n,0
input:push cx
      call inp
      mov dx,0                      ;数值位数计数器
      mov var,0
      mov flag,0
      push cx
      sub cx,1
      jcxz en
      lop1:                         ;将输入字符串的ASC转为数值
      lea bx,buf+2
      add bx,dx
      mov al,[bx]
      mov ah,0
      sub ax,30h
      mov bx,var
      add ax,bx
      mul ten
      mov var,ax
      inc dx                        ;降一位
      loop lop1
en:   pop cx                        ;获取数值的个位
      mov bx,n
      mov len[bx],cx
      dec cx
      lea bx,buf+2
      add bx,cx
      mov cl,[bx]                   ;个位存于cx
      sub cl,30h
      mov ch,0
      mov bx,var                    ;百十位移到bx
      add bx,cx                     ;百十位于个位相加
      mov cx,bx                     ;结果存入cx
      mov bx,n
      mov num[bx],cx                ;将输入数值顺序存入num的连续空间
      add n,2
      pop cx
      loop input
;.............................................................
;......................冒泡排序...............................
      mov cx,19
      loop1:
            push cx
            mov bx,0
      loop2:
            mov ax,num[bx]
            cmp ax,num[bx+2]
            jbe next
            xchg ax,num[bx+2]
            mov num[bx],ax
            mov ax,len[bx]
            xchg ax,len[bx+2]
            mov len[bx],ax
      next:
            add bx,2
            dec cx
            jne loop2
            pop cx
      loop loop1
;.............................................................
      mov dx,offset tip2            ;提示语
      mov ah,09h
      int 21h
;......................排序后数值的显示.......................
      mov cx,20
      mov n,0
output: push cx
      mov bx,n
      mov ax,num[bx]
      mov cx,len[bx]
      mov dx,0
lop2: div tenW
      add dl,30h
      push dx
      mov dx,0
      loop lop2
      mov cx,len[bx]
      mov flag,0
lop3: pop dx
      cmp dl,30h
      jne go                 ;输入不为0则输出
      cmp flag,4             ;没有无效0则输出
      je go
      inc flag
      mov ax,len[bx]
      cmp flag,al             ;如果全0则要输出1个0
      je go
      jmp J                  ;如果输入在百位或十位有无效0则不输出
go:   mov flag,4             ;已经将无效0输出完
      mov ah,02h
      int 21h
J:    loop lop3
      mov dl,20h              ;空格
      mov ah,02h
      int 21h
      add n,2
      pop cx
      loop output
;.............................................................
      mov ah,4ch
      int 21h

;.............................................................
inp   proc
      jmp q
re:   mov dx,offset tip3            ;提示语
      mov ah,09h
      int 21h
q:    lea dx,buf                    ;数字的输入
      mov ah,0ah
      int 21h
      mov dl,0ah                    ;换行
      mov ah,02h
      int 21h
      mov dl,0dh
      mov ah,02h
      int 21h
      mov cl,buf+1                  ;获取输入字符长度
      mov ch,0
      lea bx,buf+2
      add bx,cx
      mov byte ptr [bx],'$'         ;将输入最后的0DH变为$
      lea bx,buf+2
L:    cmp buf[bx],30h
      jb re
      cmp buf[bx],39h
      ja re
      inc bx
      cmp buf[bx],24h
      jne L
      ret
inp   endp
code  ends
      end start

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?