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

📄 student.asm

📁 本设计使用汇编语言来实现一个简单的基础问题
💻 ASM
字号:
;****************************************************************************************
;附加段定义
       EXTRA  SEGMENT               ;define extra segment
      SCORE1  DW        10 DUP(?)
       EXTRA  ENDS

;数据段定义

        DATA  SEGMENT               ;define data segment
     NAMETAB  DB        10 DUP(5 DUP(?))        ;name table
       SCORE  DW        10 DUP(?)   ;score table
        RANK  DW        10 DUP(?)   ;rank table
     NAMELEN  DW        ?
       COUNT  DW        ?

       MESS1  DB        'Please input student name and score',13,10,'$'
       MESS2  DB        'Sorry!you input false data,please input true data',13,10,'$'
       MESS3  DB        ' Name:','$'
       MESS4  DB        ' Score:','$'
       MESS5  DB        'The rank of score',13,10,'$'
       MESS6  DB        'Display the student name $'
       MESS7  DB        'Display the student score $'
       MESS8  DB        'Display the student rank $'

    MESSAGE1  DB        '**************** MENU *******************',13,10,'$'
    MESSAGE2  DB        'choice 1:INPUT NAME AND SCORE!',13,10,'$'
    MESSAGE3  DB        'choice 2:caculate the rank!',13,10,'$'
    MESSAGE4  DB        'choice 3:SHOW THE NAME SCORE AND RANK!',13,10,'$'
    MESSAGE5  DB        'choice 4:quit!',13,10,'$'
    MESSAGE6  DB        '*****************************************',13,10,'$'

        DATA  ENDS
; ******************************************************************************
        CODE  SEGMENT
;****************************主程序*************************************
        MAIN  PROC      FAR
              ASSUME    CS:CODE,DS:DATA,ES:EXTRA
      START:

              PUSH      DS
              SUB       AX,AX
              PUSH      AX
              MOV       AX,DATA
              MOV       DS,AX
              MOV       AX,EXTRA
              MOV       ES,AX

              CALL      MENU
   OPERATOR:  MOV       AH,1
              INT       21H
              CMP       AL,31H      ;当输入1,执行输入名字分数
              JE        READDATA
              CMP       AL,32H      ;当输入2,执行排序计算名次
              JE        RANK1
              CMP       AL,33H      ;当输入3,执行显示名字,分数,名次
              JE        DISPLAY11
              CMP       AL,34H      ;当输入4,执行退出
              JE        EXIT
              JMP       EXIT

   READDATA:  CALL      INPUTDATA
              CALL      CRLF
              CALL      MENU
              JMP       OPERATOR

      RANK1:  CALL      CHANGEMEM
              CALL      FAR PTR SCOREARRANGE
              CALL      RANK2
              CALL      CRLF
              CALL      MENU
              JMP       OPERATOR

  DISPLAY11:
              CALL      FAR PTR  DISPLAY2
              CALL      CRLF
              CALL      MENU
              JMP       OPERATOR
       EXIT:  RET
        MAIN  ENDP
;**********************主程序结束********************************
;**********************子程序************************************
        MENU  PROC      NEAR        ;菜单显示
              MOV       DX,OFFSET MESSAGE1
              MOV       AH,9H
              INT       21H
              CALL      CRLF
              MOV       DX,OFFSET MESSAGE2
              MOV       AH,9H
              INT       21H
              CALL      CRLF
              MOV       DX,OFFSET MESSAGE3
              MOV       AH,9H
              INT       21H
              CALL      CRLF
              MOV       DX,OFFSET MESSAGE4
              MOV       AH,9H
              INT       21H
              CALL      CRLF
              MOV       DX,OFFSET MESSAGE5
              MOV       AH,9H
              INT       21H
              CALL      CRLF
              MOV       DX,OFFSET MESSAGE6
              MOV       AH,9H
              INT       21H
              RET
        MENU  ENDP
;---------------------------------------------------------------------------
   INPUTDATA  PROC      NEAR        ;输入名字 ,分数
              CALL      CRLF
              MOV       DX,OFFSET MESS1
              MOV       AH,9
              INT       21H
              CALL      CRLF
              MOV       NAMELEN,0

              MOV       CX,10
        BEG:  CALL      CRLF
              MOV       AH,9
              MOV       DX,OFFSET MESS3
              INT       21H
              CALL      NEAR PTR INPUTNAME      ; 调用输入名字的子程序
              ADD       NAMELEN,5
              CALL      CRLF
              MOV       AH,9
              MOV       DX,OFFSET MESS4
              INT       21H
              CALL      NEAR PTR INPUTSCORE     ; 调用输入成绩的子程序
              ADD       SI,2
              CALL      CRLF
              LOOP      BEG
              RET
   INPUTDATA  ENDP
; --------------------------------------------------------------------------------
;输入字符 (5个字节)
   INPUTNAME  PROC      NEAR
              PUSH      CX
              MOV       DI,NAMELEN
              MOV       CX,5
       BEG1:  MOV       AH,1
              INT       21H
              MOV       NAMETAB[DI],AL
              INC       DI
              LOOP      BEG1
              POP       CX
              RET
   INPUTNAME  ENDP
;-----------------------------------------------------------------------------------------------
;输入数字  (2个字节)
  INPUTSCORE  PROC      NEAR

              MOV       BX,0
              PUSH      CX
              MOV       CX,2
       BEG2:  PUSH      CX
              MOV       AH,1
              INT       21H
              CMP       AL,30H
              JB        FALSE

              CMP       AL,39H
              JA        FALSE

              SUB       AL,30H
              CBW
              XCHG      AX,BX
              MOV       CX,10D
              MUL       CX
              XCHG      AX,BX
              ADD       BX,AX
              POP       CX
              LOOP      BEG2
              MOV       SCORE[SI], BX
              POP       CX
              JMP       EXIT1
      FALSE:  CALL      CRLF
              MOV       DX,OFFSET MESS2
              MOV       AH,9
              INT       21H
              POP       CX
              MOV       SI,0
              MOV       DI,0
              MOV       CX,10
        MAG:  MOV       RANK[BX],0
              INC       BX
              LOOP      MAG
              CALL      CRLF
              CALL      MENU
              JMP       OPERATOR
      EXIT1:  RET
  INPUTSCORE  ENDP
 ;-------------------------------------------------------------------------------
;把分数放到临时存储区
   CHANGEMEM  PROC      NEAR
              MOV       SI,0
              MOV       DI,0
              LEA       DI,SCORE1
              LEA       SI, SCORE
              CLD
              MOV       CX,10
              REP       MOVSW
              RET
   CHANGEMEM  ENDP
;---------------------------------------------------------------------------------------------------
  ;把成绩排序

            SCOREARRANGE  PROC      FAR
              MOV       CX,10
              DEC       CX
        LP1:  MOV       DI,CX
              MOV       BX,0
        LP2:  MOV       AX,SCORE1[BX]
              CMP       AX,  SCORE1[BX+2]
              JAE       AGAIN
              XCHG      AX, SCORE1[BX+2]
              MOV       SCORE1[BX],AX
      AGAIN:  ADD       BX,2
              LOOP      LP2
              MOV       CX,DI
              LOOP      LP1
              CALL      CRLF

              RET

            SCOREARRANGE  ENDP
;----------------------------------------------------------------------------------
; 排名次
       RANK2  PROC      NEAR
              CALL      CRLF
              MOV       BX,0
              MOV       AX,1
              MOV       COUNT,AX
              MOV       CX,10
              MOV       DI,-2
      BEG33:  ADD       DI,2
              MOV       AX,SCORE[DI]
              PUSH      CX
              MOV       CX,10
              MOV       SI,0
      BEG44:  CMP       AX,SCORE1[SI]
              JE        AGAIN1
              ADD       COUNT,1
              ADD       SI,2
              LOOP      BEG44
              JMP       EXIT3
     AGAIN1:  POP       CX
              MOV       AX,COUNT
              MOV       RANK[BX], AX
              ADD       BX,2
              MOV       COUNT,1

      EXIT3:  LOOP      BEG33
              CALL      CRLF
              LEA       DX,MESS8
              MOV       AH,9H
              INT       21H
              CALL      CRLF
              CALL      DISPLAY4
              RET

       RANK2  ENDP
;***************************rank end****************************************
;-----------------------------------------------------------------------------------------
;显示结果
    DISPLAY2  PROC      FAR
              CALL      CRLF
              MOV       AH,9
              LEA       DX, MESS6
              INT       21H
              CALL      CRLF

              CALL      DISPLAY33
              CALL      CRLF

              MOV       AH,9
              LEA       DX,MESS7
              INT       21H
              CALL      CRLF
              CALL      DISPLAY3
              CALL      CRLF

              MOV       AH,9
              LEA       DX, MESS8
              INT       21H
              CALL      CRLF
              CALL      DISPLAY4
              RET
    DISPLAY2  ENDP


;***************************************************************************************
 ;显示名字
   DISPLAY33  PROC      NEAR


              MOV       DI,0
              MOV       CX,10

       LOP3:  PUSH      CX
              MOV       CX,5
       LOP4:  MOV       DL,NAMETAB[DI]
              MOV       AH,2H
              INT       21H
              INC       DI
              LOOP      LOP4
              
              MOV       DL,20H
              MOV       AH,2H
              INT       21H

              POP       CX
              LOOP      LOP3
              CALL      CRLF
              CALL      CRLF
              RET
   DISPLAY33  ENDP
;-----------------------------------------------------------------------------------
;显示分数
    DISPLAY3  PROC      NEAR
              MOV       SI,0
              MOV       CX,10
       BEG3:
              MOV       BX,SCORE[SI]
              CALL      BINIDEC

              MOV       DL,20H
              MOV       AH,2H
              INT       21H
              ADD       SI,2

              LOOP      BEG3
              RET
    DISPLAY3  ENDP


;---------------------------------------------------------------------------------------------
;显示名次
    DISPLAY4  PROC      NEAR

              MOV       SI,0
              MOV       CX,10
       BEG4:
              MOV       BX,RANK[SI]
              CALL      BINIDEC
              MOV       DL,20H
              MOV       AH,2H
              INT       21H
             ; CALL      CRLF
              ADD       SI,2
              ;CALL      CRLF
              LOOP      BEG4
              RET
    DISPLAY4  ENDP
;--------------------------------------------------------------------------------------------
 ;把一个数从二进制转换为十进制
     BINIDEC  PROC      NEAR
              PUSH      BX
              PUSH      CX
              PUSH      SI
              PUSH      DI
              MOV       CX,10D
              CALL      DEC_DIV
              MOV       CX,1D
              CALL      DEC_DIV
              POP       DI
              POP       SI
              POP       CX
              POP       BX
              RET
     BINIDEC  ENDP
;----------------------------------------------------------------------------------------------
;把转化结果显示出来
     DEC_DIV  PROC      NEAR

              MOV       AX,BX
              MOV       DX,0
              DIV       CX
              MOV       BX,DX

              MOV       DL,AL
              ADD       DL,30H
              MOV       AH,02H
              INT       21H

              RET
     DEC_DIV  ENDP
;-------------------------------------------------------------------------------------------
;回车换行
        CRLF  PROC      NEAR
              MOV       DL,0AH
              MOV       AH,02H
              INT       21H

              MOV       DL,0DH
              MOV       AH,02H
              INT       21H

              RET
        CRLF  ENDP


;************************************************************************
        CODE  ENDS
              END       START

⌨️ 快捷键说明

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