匯編綜合實驗


匯編綜合實驗


匯編綜合實驗代碼書寫思路

  • 實驗目的:熟練掌握和綜合運用順序結構、分支程序的結構、循環程序結構和子程序結構的編程方法;熟練掌握主程序與子程序之間的調用關系和參數傳遞方法。
  • 實驗要求:利用匯編語言的綜合程序結構編制程序
  • 實驗內容:功能要求:
  • 功能一:進入時,設計密碼輸入驗證功能;
  • 功能二:鍵盤輸入全班同學( 35 人)的總成績;
  • 功能三:對全班同學的成績進行從高到低的排名並在顯示器上顯示結果;
  • 功能四:統計出不及格的人數並在顯示器上輸出。
  • 功能五:統計並求出全班的平均成績,在顯示器上輸出平均成績。

實現思路:

  • 1.首先整體構思,需要一個主函數,需要各個分函數
  • 2.分函數有:① 密碼驗證,② 輸入人數,③ 輸入成績,④ 計算總和,⑤ 統計不及格人數,⑥ 計算平均值,⑦ 輸出顯示
  • 3.根據每一個分函數所需要的內容,再進行每一步的操作步驟

代碼編譯運行圖:

photo1

photo2


實驗代碼:


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


  • 有錯誤之處歡迎指出
  • 如果有更好的思路請指教


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM