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

📄 复件 xueshengchengji.asm

📁 对输入的学生成绩进行排名
💻 ASM
字号:
DATA          SEGMENT   
GRADE         DW        50 DUP(?)
RANK          DW        50 DUP(?)
N             DB        ? 
BUF           DB        'WELCOME !DO YOU WANT TO DO IT?(Y/N),ODH,OAH$'                   
BUF1          DB        'Please input the number of students of your class!,0dh,0ah$' 
BUF2          DB        'Now,input the score of student follow the NO. of the student!$'   
BUF3          DB        'The last result is:$'                                            
DATA          ENDS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;                            
CODE          SEGMENT  
ASSUME    CS:CODE ,DS:DATA,ES:DATA
START:        MOV       AX,DATA
              MOV       DS,AX
              MOV       AX,DATA
              MOV       ES,AX                ;加载数据段 
MAIN          PROC      FAR                 ;主函数 
BEGIN:        LEA       DX,BUF
              MOV       AX,SEG BUF
              CALL      OUTBUF              ;调用字符传输出函数 
              ;CALL      CRLF                 ;调用回车换行函数 
              MOV       AH,01H
              INT       21H
              CMP       AL,'N'                 
              JE        EXIT0                  ;判断是否进入排序功能程序 
              CALL      CRLF                           
              LEA       DX,BUF1               ;传BUF1偏移地址给DX
              MOV       AX,SEG BUF1          ;传BUF1段地址给AX
              CALL      OUTBUF
              ;CALL      CRLF                 ;调用CRLF子程序,实现回车换行                                                                       
              CALL      INNUM               ;调用INNUM子程序,实现输入数据 
              MOV       N,BL                                              
              CALL      PRINT         ;调用PTINT子程序,实现输入班级学生成绩 
              CALL      CHANGE      ;调用CHANGE子程序,实现对班级学生的班级名次的排列 
              CALL      PRINTF                 ;调用PRINTF子程序,实现按学生学号输出班级名次
              JMP       BEGIN             
EXIT0:        MOV       AH,4ch
              INT       21h
              
MAIN          ENDP
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;          
PRINT         PROC      NEAR                ;输入班级学生成绩函数                
              MOV       BH,1                ;将1传送给BH
              MOV       AL,1           
              LEA       SI,GRADE 
              PUSH       DX    
              PUSH      SI                  ;将GRADE数组偏移地址送入堆栈 
REPEAT0:      MOV       [SI],AL            ;在子单元的低字节存入学生学号
              ADD       SI,2               ;跳到下一个字单元 
              INC       AL                 
              CMP       AL,N
              JBE       REPEAT0             ;循环存入学生的学号,从1号开始递加到N           
              LEA       DX,BUF2
              MOV       AX,SEG BUF2             
              CALL      OUTBUF              ;输出字符数组BUF2 
              CALL      CRLF
              POP       SI             
              POP       DX
              INC       SI                  ;使SI指向字单元的高字节              
REPEAT1:      CALL      INNUM               ;输入一个两位数学生成绩              
              MOV       [SI],BL            ;将输入学生的成绩存入该学生学号的所在字节单元的下一个字节单元,即存入字单元的高字节 
              ADD       SI,2               ;跳到下一个字节单元               
              INC       BH
              CMP       BH,N                             
              JBE      REPEAT1              ;循环存入N位学生的成绩               
              RET
PRINT         ENDP
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;                            
CHANGE        PROC      NEAR               ;名次处理函数 
              MOV       CL,N              
              DEC       CL
NEXT:         LEA       SI,GRADE                        
              MOV       DL,N            
NEXT1:        DEC       DX               
              MOV       AX,[SI]            ;第一个人的学号及成绩传给AX        
              MOV       BX,[SI+2]          ;第二个人的学号及成绩传给BX 
              CMP       DX,0
              JE        EXIT                
              ADD       SI,2               ;偏移地址自加,取下一个存储单元 
              CMP       AH,BH
              JAE       NEXT1               ;如果AH>=BH,继续循环,否则交换AX,BX 
              XCHG      AX,BX               ;交换AX,BX
              MOV       [SI-2],AX           ;将较好成绩的学生学号及成绩存在上一个存储单元   
              MOV       [SI],BX             ;将较差成绩的学生学号及成绩存在下一个存储单元   
              JMP       NEXT1                ;继续循环,直到DX为零,跳出循环,成绩最差的一名学生学号及成绩放在最后一个存储单元 
EXIT:         LOOP      NEXT                 ;循环排序,实现将学生学号和成绩字单元按学生成绩由高到低排列 
              MOV       CL,N
              LEA       SI,GRADE
              INC       SI
              MOV       BL,1
              PUSH      AX
              PUSH      CX 
              MOV       CH,0                           
NEXT2:        MOV       CL,[SI]
              MOV       [SI],BL             
              ADD       SI,2
              INC       CH
              CMP       CH,N
              JE        P2
              CMP       [SI],CL            
              JE        NEXT2
              INC       BL
              LOOP      NEXT2                ;将学生成绩单元存入该学生的班级名次,按成绩由高到低存入1~N 
P2:           MOV       CL,N
              DEC       CL
              POP       CX
              POP       AX
NEXT3:        LEA       SI,GRADE 
              MOV       DL,N
NEXT4:        DEC       DX
              MOV       AX,[SI]
              MOV       BX,[SI+2]
              CMP       DX,0
              JE        EXIT2
              ADD       SI,2
              CMP       AL,BL                 ;比较学生学号 
              JB        NEXT4                 ;实现按将学号大的学生及名次移到最后一个学生数组单元 
              XCHG      AX,BX
              MOV       [SI-2],AX
              MOV       [SI],BX
              JMP       NEXT4
EXIT2:        LOOP      NEXT3                  ;循环排序,实现将学生学号和名次字单元按学生成绩由低到高排列 
              LEA       SI,GRADE
              LEA       DI,RANK
              MOV       CL,N
              REP       MOVSW                  ;将按学号排序好的学生学号和名次数组内容传给RANK数组 
              RET
CHANGE        ENDP
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;                            
PRINTF        PROC      NEAR                    ;名次输出函数,实现按学生学号输出名次 
              PUSH      DX
              PUSH      AX
              LEA       DX,BUF3
              MOV       AX,SEG BUF3
              CALL      OUTBUF
              CALL      CRLF
              POP       DX
              POP       AX
              LEA       SI,RANK
              INC       SI
              MOV       CL,N
              PUSH      AX
              PUSH      BX 
              MOV       AX,0             
P1:           XOR       AX,AX              
              MOV       AL,[SI]
              CMP       AL,9
              JBE       P4
              MOV       BL,10D              
              DIV       BL 
              MOV       BH,AH
              MOV       DL,AL
              ADD       DL,30H
              MOV       AH,02H              
              INT       21H 
              MOV       DL,BH
              ADD       DL,30H
              INT       21H                   ;实现名次输出               
              CALL      CRLF                   ;回车换行 
              JMP       P7
P4:           MOV       DL,AL
              ADD       DL,30H              
              MOV       AH,02H
              INT       21H  
              CALL      CRLF               
P7:           ADD       SI,2
              LOOP      P1                     ;循环输出学生名次
              POP       BX
              POP       AX
              RET              
PRINTF        ENDP
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;                            
CRLF          PROC      NEAR                   ;回车换行函数,实现回车换行 
              MOV       DL,0DH
              MOV       AH,02H
              INT       21H
              MOV       DL,0AH
              MOV       AH,02H
              INT       21H
              RET
CRLF          ENDP
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
OUTBUF        PROC      NEAR                ; 输出字符数组函数 
              MOV       DS,AX
              MOV       AH,09H
              INT       21H
              RET                                              
OUTBUF        ENDP
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
INNUM         PROC      NEAR                ;数据输入函数                                  
              MOV       BL,0      
REPEAT5:      MOV       AH,01H             
              INT       21H
              CMP       AL,0DH
              JZ        P3              
              SUB       AL,30H
              XCHG      AL,BL
              MOV       CX,10
              MUL       CL
              XCHG      AL,BL
              ADD       BL,AL             
              JMP       REPEAT5              
P3:           CALL      CRLF              
              RET
INNUM         ENDP                                                                        
              CODE ENDS
              END       START              
              
                                                  
                                                       
                                          
              
                                                                
                     
                                         
                            
                                                                                    
                            

⌨️ 快捷键说明

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