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

소스가 많이 스파게티 냠냠

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

'노트정리 > 어셈블리 책 스터디 공간' 카테고리의 다른 글

6.9.11 메세지 암호화  (0) 2010.07.26
6.9.10 오버플로까지 피보나치 출력  (0) 2010.07.14
6.9.9가중확률  (0) 2010.07.13
6.9.7 부울계산기(1)  (0) 2010.07.13
6.9.4 시험성적계산2 (어셈블리어)  (0) 2010.06.30
6.9.3 시험성적계산  (0) 2010.06.30
6.9.2 루프 구현  (0) 2010.06.30
색상 행렬  (0) 2010.06.14
Posted by 공돌이pooh
,