匯編綜合實驗
匯編綜合實驗代碼書寫思路
- 實驗目的:熟練掌握和綜合運用順序結構、分支程序的結構、循環程序結構和子程序結構的編程方法;熟練掌握主程序與子程序之間的調用關系和參數傳遞方法。
- 實驗要求:利用匯編語言的綜合程序結構編制程序
- 實驗內容:功能要求:
- 功能一:進入時,設計密碼輸入驗證功能;
- 功能二:鍵盤輸入全班同學( 35 人)的總成績;
- 功能三:對全班同學的成績進行從高到低的排名並在顯示器上顯示結果;
- 功能四:統計出不及格的人數並在顯示器上輸出。
- 功能五:統計並求出全班的平均成績,在顯示器上輸出平均成績。
實現思路:
- 1.首先整體構思,需要一個主函數,需要各個分函數
- 2.分函數有:① 密碼驗證,② 輸入人數,③ 輸入成績,④ 計算總和,⑤ 統計不及格人數,⑥ 計算平均值,⑦ 輸出顯示
- 3.根據每一個分函數所需要的內容,再進行每一步的操作步驟
代碼編譯運行圖:
實驗代碼:
DATA SEGMENT
PASSWD DB '123456$' ;預設密碼
LEN1 EQU $-PASSWD ;密碼串長度
WELCOME DB 'Please input password: $' ;輸入密碼語句
TRUE DB 'Pass !$'
FALSE DB 'Password Fail !','$'
TIP_OF_INPUT DB 'Please input number of student: $' ;提示輸入學生人數
TIP DB 'Input Score of Student: $' ;提示輸入學生
STR_OF_STU DB 256 DUP('$') ;存放學生人數
STR DB 512 DUP('$') ;學生成績存放
PASS DB 256 DUP('$') ;輸入密碼位置
STR_SCORE DB 'The student score is $'
SCORE DW 50 DUP(0)
SUM DW 0
STR_AVE1 DB 'AVE1= $'
AVE1 DW 0
STR_AVE2 DB 'AVE2= $'
AVE2 DW 0
STR_UNPASS DB 'Student unpass number: $'
SCO_FAIL DW 0
STUDENT_NUMBER DW 5
DIVI DW 10000,1000,100,10,1
RESULT DB '00000$'
DATA ENDS
CODE SEGMENT
ASSUME DS:DATA,CS:CODE
START:
MAIN PROC
MOV AX,DATA
MOV DS,AX
MOV ES,AX
XOR BX,BX
;------------------------------------------------------比較密碼
CALL CMPASSWD ;輸入密碼
CMP DX,0
JZ EXIT ;判斷密碼是否正確
MOV DX,OFFSET TRUE
MOV AH,09H
INT 21H
CALL BACKSPACE
;----------------------------------------密碼正確之后
CALL INPUT_STUDENT_NUMBER ;輸入學生人數
CALL INPUT ;輸入
CALL SUMP ;計算總和
CALL AVERAGE ;計算平均值
CALL UNPASS ;計算不及格人數
CALL BUBBLE ;冒泡算法
CALL OUTPUTALL ;輸出
EXIT:
MOV AH,4CH
INT 21H
MAIN ENDP
;==========================程序段
CMPASSWD PROC
;----------------------------------------輸入密碼段
AGAIN:
LEA DX,WELCOME
MOV AH,09H
INT 21H
LEA DX,PASS
MOV AH,0AH
INT 21H
LEA SI,PASSWD
LEA DI,PASS+2
CALL BACKSPACE
;--------------------------------------------
MOV CX,LEN1-1
CLD
REPZ CMPSB
JNZ NPAIR
MOV DL,[DI+1]
CMP DL,'$'
JNZ NPAIR
MOV DX,1
RET
NPAIR:
INC BX
;--------------------------------------------
PUSH CX
PUSH BX
PUSH SI
LEA SI,PASS
MOV CX,255
MOV BX,'$'
CLEAR:
MOV [SI],BX
INC SI
LOOP CLEAR
POP SI
POP BX
POP CX
;-------------------------------------恢復段
CMP BX,3
JNZ AGAIN
MOV DX,OFFSET FALSE
MOV AH,09H
INT 21H
MOV DX,0
RET
CMPASSWD ENDP
;*****************************************以上是密碼輸入判斷段
INPUT_STUDENT_NUMBER PROC
XOR BX,BX
XOR SI,SI
MOV DX,OFFSET TIP_OF_INPUT
MOV AH,09H
INT 21H
MOV DX,OFFSET STR_OF_STU
MOV AH,0AH
INT 21H
MOV DL,'$'
LEA SI,STR_OF_STU+2
XOR AX,AX
AG:
MOV CH,'0'
CMP [SI],CH
JB RRR
MOV CH,'9'
CMP [SI],CH
JA RRR
MOV BL,BYTE PTR [SI]
SUB BX,48
MOV DH,10
IMUL DH
ADD AX,BX
RRR:
INC SI
CMP DL,[SI]
JZ EXIT2
JMP AG
EXIT2:
MOV STUDENT_NUMBER,AX
CALL BACKSPACE
RET
INPUT_STUDENT_NUMBER ENDP
;++++++++++++++++++++++++以上是輸入學生人數段
INPUT PROC
MOV DX,OFFSET TIP
MOV AH,09H
INT 21H
LEA DX,STR ;計算偏移量,放入STR中儲存
MOV AH,0AH ;進行輸入
INT 21H
LEA SI,STR+2 ;定位字符串
MOV DH,'$' ;這里要判斷字符串
;結尾
MOV DL,' ' ; bx 中放置空格,dx中
;放置錢符號
XOR AX,AX
XOR CX,CX
XOR DI,DI
LOP:
CMP DH,[SI] ;如果到達了字符串結尾,那么結束
JZ BREAK
CMP DL,[SI] ;如果是空格符號,繼續進行加一
JNZ OP1
MOV SCORE[DI],AX
ADD DI,2
XOR AX,AX
JMP CONTINUE
;要不然就判斷是否是0-9,如果是,執行以下操作
;-------------------------
OP1:
MOV CH,'0'
CMP [SI],CH
JB CONTINUE
MOV CH,'9'
CMP [SI],CH
JA CONTINUE
;以上判斷是否是0-9之間的內容,如果是,那么就進行以下內容,如果不是,指針加一
;------------------
MOV AH,10
IMUL AH
MOV CL,[SI] ;[SI]移去CL中
SUB CL,48 ;用CL中的內容減去48
ADD AL,CL ;AL原來有的數值加上CL中的內容
CONTINUE:
INC SI
JMP LOP
BREAK:
MOV SCORE[DI],AX ;???
RET
INPUT ENDP
;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^以上是數據輸入轉換段
SUMP PROC
XOR AX,AX
XOR BX,BX
XOR CX,CX
XOR DX,DX
MOV DX,STUDENT_NUMBER ;這里為什么不能用
MOV SI,0
COUNT:
ADD AX,SCORE[SI]
ADD SI,2
DEC DX
CMP DX,0
JNZ COUNT
MOV SUM,AX
RET
SUMP ENDP
;#######################以上是計總和段
BUBBLE PROC
XOR AX,AX
XOR BX,BX
XOR CX,CX
XOR DX,DX
XOR SI,SI
XOR DI,DI
MOV SI,0
MOV CX,STUDENT_NUMBER
; MOV CX,30 ;輸入人數
DEC CX
OUTER:
MOV AX,SCORE[SI]
PUSH CX
MOV DI,SI
INNER:
ADD DI,2
MOV DX,SCORE[DI]
CMP AX,DX
; JLE CONT
JAE CONT
XCHG AX,DX ;交換兩個值,AX和DX
MOV SCORE[SI],AX
MOV SCORE[DI],DX
CONT:
LOOP INNER
POP CX
ADD SI,2
LOOP OUTER
;基本思想:CX作為循環,內外層都是CX進行循環,第一循環n次,第二次循環n-i次
RET
BUBBLE ENDP
;@@@@@@@@@@@@@@@@@@以上是排序段
AVERAGE PROC
XOR AX,AX
XOR BX,BX
XOR CX,CX
XOR DX,DX
MOV AX,SUM
MOV CX,STUDENT_NUMBER
; MOV CX,3 ;需要修改人數
IDIV CX
MOV AVE1,AX
MOV AVE2,DX
RET
AVERAGE ENDP
;&&&&&&&&&&&&&&&&&&&&以上是求解均值段
UNPASS PROC
XOR BX,BX
MOV SI,0
; MOV CX,30 ;人數
MOV CX,STUDENT_NUMBER
CC:
CMP SCORE[SI],60
JAE LP ;60分以下的分數
INC BX
LP:
ADD SI,2
LOOP CC
MOV SCO_FAIL,BX
RET
UNPASS ENDP
;'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''以上是計算不及格人數
;----如果是負數,那么輸出負號,如果不是,輸出正數
OUTPUTAX PROC
;東西放在AX中,輸出AX中的內容
CMP AX,0
JGE GO
PUSH AX
MOV DX,'-'
MOV AH,02H
INT 21H
POP AX
NEG AX
GO: MOV SI,OFFSET DIVI
MOV DI,OFFSET RESULT
MOV CX,5
AA:
MOV DX,0
DIV WORD PTR [SI]
ADD AL,48
MOV BYTE PTR [DI],AL
INC DI
ADD SI,2
MOV AX,DX
LOOP AA
MOV CX,4
MOV DI,OFFSET RESULT
BB:
CMP BYTE PTR [DI],'0'
JNE PRINT
INC DI
LOOP BB
PRINT:
MOV DX,DI
MOV AH,09H
INT 21H
MOV DX,' '
MOV AH,02H
INT 21H
RET
OUTPUTAX ENDP
;#######################以上是十進制輸出顯示,放在BX當中
OUTPUTALL PROC
;首先輸出學生平均值
;然后輸出不通過的學生人數
;最后輸出所有學生成績
MOV CX,STUDENT_NUMBER
MOV SI,0
CALL BACKSPACE
DISPLAY:
PUSH CX
XOR AX,AX
MOV AX,SCORE[SI]
PUSH SI
CALL OUTPUTAX
POP SI
ADD SI,2
MOV DX,' '
MOV AH,02H
INT 21H
POP CX
LOOP DISPLAY ;輸出學生成績
CALL BACKSPACE
;.....................................................................................輸出學生所有成績
MOV DX,OFFSET STR_UNPASS
MOV AH,09H
INT 21H
MOV AX,SCO_FAIL
CALL OUTPUTAX
CALL BACKSPACE
;..........................................................................輸出學生不及格人數
MOV DX,OFFSET STR_AVE1
MOV AH,09H
INT 21H
MOV AX,AVE1
CALL OUTPUTAX
CALL BACKSPACE
MOV DX,OFFSET STR_AVE2
MOV AH,09H
INT 21H
MOV AX,AVE2
CALL OUTPUTAX
CALL BACKSPACE
;...............................................................................以上輸出平均值
RET
OUTPUTALL ENDP
;~~~~~~~~~~~~~~~~~~~輸出所有
BACKSPACE PROC
PUSH AX
PUSH DX
MOV DX,0DH
MOV AH,02H
INT 21H
MOV DX,0AH
MOV AH,02H
INT 21H
POP DX
POP AX
RET
BACKSPACE ENDP
;===========================程序代碼段
CODE ENDS
END START
;功能一:實現密碼驗證
;功能二:實現輸入35人的總成績
;功能三:對全班同學的成績從高到低排序並顯示輸出
;功能四:統計不及格人數並顯示輸出
;功能五:求出全班平均成績並顯示輸出
;STR_SCORE DB 'The student score is $'
;STR_AVE1 DB 'AVE1= $'
;STR_AVE2 DB 'AVE2= $'
;STR_UNPASS DB 'Student unpass number: $'
;SCO_FAIL DB 0
- 有錯誤之處歡迎指出
- 如果有更好的思路請指教