微机原理实验4:统计学生成绩
一、實驗目的
掌握比較綜合性的匯編程序設計流程,以及多分支情況下程序的設計技巧。
二、實驗內容
設計程序統計學生數學成績。分別歸類90-99分、80-89分、70-79分、60-69分及60分以下,并將各段的人數及成績存入對應的內存單元中,并在屏幕上顯示。
三、程序清單
CRLF MACROMOV DL,0DHMOV AH,02HINT 21HMOV DL,0AHMOV AH,02HINT 21H ENDMDATA SEGMENT ;數據段,成績區 DATA1 DB 89H,92H,74H,85H,96H,73H,62H,78HDB 49H,59H,97H,66H,84H,81H,79H,67HDB 90H,88H,76H,82H,71H,69H,84H,81HDB 79H,65H,94H,86H,76H,82H,75H,83H DA90 DB 16 DUP (0) ;首字節為人數,隨后為成績 DA80 DB 16 DUP (0) DA70 DB 16 DUP (0) DA60 DB 16 DUP (0) DA50 DB 16 DUP (0) KKK EQU DA90 - DATA1 ;總人數 DATA ENDSCODE SEGMENT MAIN PROC FARASSUME CS:CODE,DS:DATA,ES:DATA START: PUSH DSSUB AX,AXPUSH AXMOV AX,DATAMOV DS,AXMOV ES,AXLEA SI,DATA1 ;SI 指向成績表首MOV CX,KKK ;循環數(總人數)送 CX LOOP1: MOV AL,[SI] ;將成績按字節送入ALCMP AL,90HJNC KK90 ;成績 >= 90 轉CMP AL,80HJNC KK80 ;成績 >= 80 轉CMP AL,70HJNC KK70 ;成績 >= 70 轉CMP AL,60HJNC KK60 ;成績 >= 60 轉LEA DI,DA50 ;不及格區首地址送 DIJMP TTT KK60: LEA DI,DA60 ;60分區首地址送 DIJMP TTT KK70: LEA DI,DA70 ;70分區首地址送 DIJMP TTT KK80: LEA DI,DA80 ;80分區首地址送 DIJMP TTT KK90: LEA DI,DA90 ;90分區首地址送 DI TTT: MOV BL,[DI] ;BL = 存放人數地址INC BL ;該段人數+1MOV [DI],BL ;存該段人數MOV AL,[SI]XOR BH,BHMOV [DI+BX],AL ;成績存入該段INC SI ;修改地址指針LOOP LOOP1LEA SI,DA90CALL DISPL ;顯示 90 - 99分人數及成績LEA SI,DA80CALL DISPL ;顯示 80 - 89分人數及成績LEA SI,DA70CALL DISPL ;顯示 70 - 79分人數及成績LEA SI,DA60CALL DISPL ;顯示 60 - 69分人數及成績LEA SI,DA50CALL DISPL ;顯示 60分以下人數及成績RETDISPL PROC NEAR ;子程序:顯示某段人數及成績MOV BL,[SI] ;取人數MOV AL,BLMOV CL,10CBW ;符號擴展指令,AL的內容擴展到AH,形成AX中的字。;如果AL的最高有效位是0,則AH = 00,AL的最高有效位為1,則AH = FFH。AL不變。(即將AL的符號位移至AH)DIV CL ;8位除法,被除數放在AX中,除數為8位在CL中,;AL存儲除法操作的商(即十位),AH存儲除法操作的余數(即個位)MOV DX,AXADD DL,30H ;將十位加30H轉換為ASCII碼,后面類似MOV AH,02 ;調用INT 21H中斷的2號功能進行顯示輸出,輸出字符存在DL中INT 21H ;顯示十位MOV DL,DHADD DL,30HMOV AH,02INT 21H ;顯示個位MOV DL,20H ;空格的ASCII碼MOV AH,02INT 21H ;顯示空格 DISP1: INC SI ;指向下一單元MOV DL,20HMOV AH,02INT 21HMOV DL,[SI] ;取成績MOV CL,04ROL DL,CLAND DL,0FHADD DL,30HMOV AH,02INT 21H ;顯示十位MOV DL,[SI]AND DL,0FHADD DL,30HMOV AH,02INT 21H ;顯示個位DEC BLJNZ DISP1CRLF ;回車換行RET DISPL ENDPMAIN ENDP CODE ENDSEND START四、實驗過程
1.用編輯器建立源文件D101-4.ASM
2.用匯編程序MASM.EXE對源文件進行匯編,產生目標文件,再用連接程序LINK產生可執行文件
3.使用調試工具DEBUG進行程序調試
先用U命令反匯編,以便了解指令地址。顯示結果如下,具體調試結果見第五部分。
五、實驗結果分析
1.程序調試及結果
使用U命令查看匯編指令,可以看到共有32個成績需要統計。
使用-d ds:0查看成績內存區存放情況,使用-G 12指令執行到從成績內存區讀取成績指令,可以看到第一個成績為89,如下
使用-t指令單步運行程序,因為第一個成績為89,所以在第一次比較時跳轉不成立,在第二次比較時跳轉成立,跳轉到KK80標號處,如下
使用-g 51指令執行到將該成績存入80分區內存地址段,再使用-d ds:0進行查看成績區內存情況,可以看到此時80分區人數已經變為1,且此人成績為89,如下
依次類推,將源地址指針SI進行加1,指向下一個成績(字節),再進行循環操作,按照比較、跳轉、取相應分區首地址、人數累加、存放成績的流程進行操作,按照該流程循環成績總數32次以后,成績區內存如下
由上圖可以看出,90分以上有5人,80-90分有0B(11)人,70-80分有9人,60~70分有5人,不及格成績有2人,分別為49分和59分。
最后,再調用顯示子程序DISPL對各分區人數及成績進行打印,該子程序采用SI寄存器進行傳參,參數為相應分區首地址,其內部核心思想為利用除法和調用INT 21H中斷分別顯示人數、成績的十位和個位,如下。
至此,整個實驗完成。
2.分析總結
首先,本次實驗的重點在于掌握成績的讀取、判斷分區、存放以及寄存器的調整,其中有個小技巧就是通過人數的增加剛好可以索引到當前成績應該存放的位置,該小技巧的使用使得程序簡潔明了,值得在今后的編程中借鑒。此外,本實驗用到了變址寄存器尋址,應該對該部分加以理解。
其次,該實驗中碰到幾個比較生疏的指令,如符號擴展指令CBW,其功能是將AL的內容擴展到AH,形成AX中的字;如果AL的最高有效位是0,則AH = 00,AL的最高有效位為1,則AH = FFH。AL不變,也就是將AL的符號位移至AH中。程序中在顯示數據時,通過8位除法指令DIV來分別依次顯示人數、成績的十位和個位;對于8位除法操作,其被除數放在AX中,除數為8位在CL中,最終結果是AL存儲除法操作的商(即十位),AH存儲除法操作的余數(即個位)。此外,該實驗也用到了INT 21H中斷的2號功能進行顯示輸出,其參數輸出字符存在DL中,該顯示操作也比較方便,后續可以借鑒。
總結
以上是生活随笔為你收集整理的微机原理实验4:统计学生成绩的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用什么网名最好听116个
- 下一篇: C语言实现01字符转比特流