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 |