⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 p231.asm

📁 汇编语言课后习题答案
💻 ASM
字号:
.model small 
.stack 40h
.data
namepar label byte    ;定义姓名变量表
maxnlen db 21         ;最大字符数
namelen db ?          ;实际字符数
namefld db 21 dup(?)
crlf    db 13,10,'$'
endaddr dw ?
messg1  db 'Name?','$'
messg2  db 'Sorted names:',13,10,'$'
namectr db 0           ;已经输入姓名的个数
nametab db 30 dup(20 dup(' '))   ;姓名表
namesav db 20 dup(?),13,10,'$'
swapped db 0

.code

main proc far
   
      mov ax,@data
      mov ds,ax
      mov es,ax

      cld
      lea di,nametab
a20loop:
      call b10read      ;接收姓名
      cmp namelen,0
      jz a30            ;不再输入姓名,排序
      
      cmp namectr,30    ;30个姓名输完?
      je a30            ;已经输入30个姓名,排序
      
      call d10stor      ;存入刚输入的姓名
      
      jmp a20loop

a30:
      cmp namectr,1     
      jbe a40          ;一个或者没有姓名输入,直接退出。
      
      call g10sort     ;排序输入的姓名
      call k10disp     ;显示存入的姓名
a40:
      mov ax,4c00h
      int 21h

main endp


;接收输入姓名的子程序
b10read proc near

     mov ah,09
     lea dx, messg1
     int 21h         ; 9号功能,显示字符串

     mov ah,0ah
     lea dx,namepar
     int 21h         ;0a号功能,接收姓名字符串、
 
     mov ah,09
     lea dx,crlf
     int 21h         ;输出回车和换行

     mov bh,0        ;输入姓名不够21个字符,清除后面的所有内容为空格。
     mov bl,namelen
     mov cx,21h
     sub cx,bx
b20: mov namefld[bx],20h
     inc bx
     loop b20
     
     ret
b10read endp    


d10stor proc near
     inc namectr       ;已经输入姓名个数加一
     cld
     lea si,namefld
     mov cx,10
     rep movsw
     ret
d10stor endp

;姓名排序子程序
g10sort proc near
    sub di,40
    mov endaddr,di       ;要比较的结束地址
g20:
    mov swapped,0
    lea si,nametab  ;要比较的起始地址。
    
g30:
    mov cx,20       ;要比较的长度
    mov di,si
    add di,20        ;下一个要比较的姓名。
    
    mov ax,di
    mov bx,si
    
    repe cmpsb
    jbe g40         ;
    call h10xchg     ;互换

g40:
    mov si,ax
    cmp si,endaddr
    jbe g30
    cmp swapped,0
    jnz g20
    ret
g10sort endp

h10xchg proc near
    mov cx,10
    lea di, namesav
    mov si,bx
    rep movsw

    mov cx,10
    mov di,bx
    rep movsw

    mov cx,10
    lea si,namesav 
    rep movsw

    mov swapped,1

    ret
h10xchg endp

k10disp proc near
    mov ah,9
    lea dx,messg2
    int 21h
    lea si,nametab
k20:
    lea di,namesav
    mov cx,10
    rep movsw
  
    mov ah,9
    lea dx,namesav
    int 21h
 
    dec namectr
    jnz k20
  
    ret
k10disp endp
   
    end main

     

⌨️ 快捷键说明

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