INCLUDE Irvine32.inc

.data
TRUE = 1
FALSE = 0
gradeAverage	DWORD ?
credits		DWORD ?
FLAG			DWORD ?	;입력 값의 범위가 정당한지 검사
OkToRegister	BYTE ?
str0			BYTE "If you want to exit this program, enter 0",0
str1			BYTE "Enter Your gradeAverage : ",0
str2			BYTE "Enter Your credits : ",0
str3			BYTE "Error...",0
strPass		BYTE	"Register Succeeded",0
strFail		BYTE "Register Failed",0

.code
main PROC
	call	Clrscr	;화면 청소
	mov	ecx,1
	
 L1:
	Entergrade:
	mov	FLAG,1
	mov	byte ptr OkToRegister,FALSE
	mov	edx,OFFSET str1
	call	WriteString	;출력 : Enter your gradeAverage
	call	ReadInt
	mov	gradeAverage,eax
	cmp	gradeAverage,0
	je	quitprogram	;0입력되면 프로그램 종료
	call	CheckgradeAverage	;gradeAverage의 범위 검사
	
	cmp	FLAG,0	;범위를 벗어난 값이면 플래그 0된다.
	je	L1		;범위를 벗어난 값이 입력되면 처음으로 돌아간다.
	cmp	word ptr gradeAverage,350
	jbe	@C0006	;Jump if gradeAverage <= 350
	mov	byte ptr OkToRegister,TRUE	;gradeAverage > 350 이면 등록 성공
	jmp	@C0008	;Jump if gradeAverage > 350 to 등록
	
@C0006:	;Jump if gradeAverage <= 350
	cmp	word ptr gradeAverage,250
	jbe	@C0009	;Jump if gradeAverage <= 250
	call	EnterCredits
	cmp	word ptr credits,16
	ja	@C0009	;Jump if credits > 16
	mov	byte ptr OkToRegister,TRUE
	jmp	@C0008	;Jump if credits <= 16 to 등록
@C0009:	;Jump if gradeAverage <= 250
	call	EnterCredits
	cmp	word ptr credits,12
	ja	correct	;Jump if credits > 12 to 등록
	mov	byte ptr OkToRegister,FALSE
@C0008:	;Jump if gradeAverage > 350 to 등록
	cmp	byte ptr OkToRegister,FALSE	;OkToRegister가 False면 등록 실패 출력
	jne	correct
	mov	edx,OFFSET strFail
	call	WriteString
	call	Crlf
	jmp	goloop
 correct:
	mov	edx,OFFSET strPass
	call	WriteString
	call	Crlf
 goloop:
	inc	ecx	;무한루프 구현. 루프 탈출 조건은 gradeAverage = 0 or credits = 0
	cmp	ecx,0
	jmp	L1
 quitprogram:
	exit
main ENDP

CheckgradeAverage	PROC
	cmp	gradeAverage,1
	jb	inputerr
	cmp	gradeAverage,400
	ja	inputerr
	jmp	continue
 inputerr:
	mov	edx,OFFSET str3
	call	WriteString	;화면에 Error메시지 출력
	call	Crlf
	mov	FLAG,0			;범위를 벗어난 값이 입력되면 플래그가 0이된다.
 continue:
	ret
CheckgradeAverage	ENDP

CheckCredits	PROC
	cmp	credits,1
	jb	inputerr
	cmp	credits,30
	ja	inputerr
	jmp continue
 inputerr:
	mov	edx,OFFSET str3
	call	WriteString
	call	Crlf
	mov	FLAG,0
 continue:
	ret
CheckCredits	ENDP

EnterCredits	PROC
start:
	mov	FLAG,1
	mov	edx,OFFSET str2
	call	WriteString	;화면에 Enter Your Credits 출력
	call	ReadInt
	mov	credits,eax	
	call	CheckCredits	;Credits범위 검사
	
	cmp	FLAG,0	;범위를 벗어난 값이면 FLAG는 0
	je	start	;범위를 벗어났으면 Credits다시 입력
	cmp	FLAG,1	;범위를 벗어난 값이 아니면
	ret			;리턴
EnterCredits	ENDP
END main

소스가 많이 스파게티 냠냠

논리적인 흐름에 따라서 코드를 작성해야하는데 책에 있는걸 이용해서 손이 먼저 움직이다 보니 이런 일이...

Posted by 공돌이pooh
,