?? 4.asm
字號:
DATA SEGMENT
GRADE DW 50 DUP(?)
RANK DW 50 DUP(?)
COUNT DW ?
MEG1 DB 'GRADE? $'
MEG2 DB 0DH,0AH,'INPUT ERROR!',0DH,0AH,'$'
MEG3 DB 'RANK: $'
MEG4 DB 0DH,0AH,'$'
DATA ENDS
STACK SEGMENT STACK
DB 100 DUP(0)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
START:
MOV AX,DATA ;定義數據段
MOV DS,AX
CALL INPUT ;調用INPUT模塊
CALL RANKP ;調用RANKP模塊
CALL OUTPUT ;調用OUTPUT模塊
OVER:
MOV AH,4CH
INT 21H
;----------INPUT顯示輸入模塊------------------
INPUT PROC NEAR
MOV DX,OFFSET MEG1 ;傳入顯示輸入信息的有效地址
MOV AH,9
INT 21H
MOV SI,0 ;指針置0
MOV COUNT,0 ;計數器初始置0
INPUTS:
CALL DECIBIN ;調用DECIBIN (10-2)
INC COUNT ;計數器加1
CMP DL,',' ;判斷數之間的','間隔
JE STORE
CMP DL,13 ;判斷回車
JE I_EXIT
JNE ERROR ;DL!=','時(不與,為間隔)產生錯誤
STORE:
MOV GRADE[SI],BX ;將成績存儲在GRADE中
ADD SI,2 ;指針加2
JMP INPUTS ;跳轉,循環輸入
ERROR:
MOV DX,OFFSET MEG2 ;傳入顯示錯誤信息的有效地址
MOV AH,9
INT 21H
JMP OVER ;出現錯誤時直接結束
I_EXIT:
MOV GRADE[SI],BX ;將最后一個成績存儲在GRADE中
CALL NEWLINE ;調用NEWLINE
RET
INPUT ENDP ;該模塊結束
;----------RANKP傳入數組模塊------------------
RANKP PROC NEAR
MOV DI,COUNT ;將錄入的學生個數傳入DI
MOV BX,0 ;基址變址置0
LP:
MOV AX,GRADE[BX] ;將傳入的成績暫時放入AX待做比較
MOV WORD PTR RANK[BX],1;名次初始置1
MOV CX,COUNT ;將總數傳入計數寄存器
LEA SI,GRADE ;傳入成績數組的地址
R_NEXT:
CMP AX,[SI] ;AX與其他數進行比較
JNB CONTINUE ;有符號比較轉移(大于或等于)
INC WORD PTR RANK[BX];名次加1(比較完后再加1)
CONTINUE:
ADD SI,2 ;指針加2,指向下一個要與AX比較的數
LOOP R_NEXT ;重復比較
ADD BX,2 ;存儲名次的位置變址加2
DEC DI ;計數DI減1
JNE LP ;DI不為0時繼續循環
RET
RANKP ENDP ;該模塊結束
;----------OUTPUT顯示結果模塊------------------
OUTPUT PROC NEAR
MOV DX,OFFSET MEG3 ;傳入顯示名次信息的有效地址
MOV AH,9
INT 21H
MOV DI,COUNT ;將錄入的學生個數傳入DI
MOV SI,0 ;指針置0
O_NEXT:
MOV BX,RANK[SI]
CALL BINIDEC ;調用顯示的子程序BINIDEC
ADD SI,2 ;指針加2
DEC DI ;計數DI減1
JZ O_EXIT ;等0時退出
MOV DL,','
MOV AH,2 ;顯示
INT 21H
JNZ O_NEXT ;DI不為0時繼續循環
O_EXIT:
CALL NEWLINE ;調用NEWLINE
RET
OUTPUT ENDP ;該模塊結束
;----------DECIBIN模塊10轉2------------------
DECIBIN PROC NEAR
MOV BX,0
CHANGE:
MOV AH,1
INT 21H
MOV DL,AL
SUB AL,30H
JL D_EXIT ;小于時退出
CMP AL,9D
JG D_EXIT ;大于時退出
CBW ;字節換字
XCHG AX,BX
MOV CX,10
MUL CX
XCHG AX,BX ;交換
ADD BX,AX
JMP CHANGE
D_EXIT:
RET
DECIBIN ENDP ;該模塊結束
;----------BINIDEC模塊2轉10------------------
BINIDEC PROC NEAR
PUSH BX ;保護現場
PUSH CX
PUSH SI
PUSH DI
MOV CX,10
CALL DEC_DIV ;調用DEC_DIV
MOV CX,1
CALL DEC_DIV ;調用DEC_DIV
POP DI ;恢復現場
POP SI
POP CX
POP BX
RET
BINIDEC ENDP
;---------DEC_DIV模塊-------------------
DEC_DIV PROC NEAR
MOV AX,BX
MOV DX,0
DIV CX ;求商余
MOV BX,DX
MOV DL,AL
ADD DL,30H
MOV AH,2
INT 21H
RET
DEC_DIV ENDP
;---------NEWLINE換行模塊-------------------
NEWLINE PROC NEAR
MOV DX,OFFSET MEG4 ;傳入MEG4的有效地址
MOV AH,9
INT 21H
RET
NEWLINE ENDP
;---------結束-------------------
CODE ENDS
END START
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -