Java Virtual Machine Chapter 5. 제어문 Ps lab 김윤경
5.1 정수의 비교 니모닉 인자 스택 효과 goto label label로 이동 if_icmpeq int1 int2 Int1==int2이면 label로 이동 if_icmpne Int1!=int2이면 label로 이동 if_icmplt Int1<int2이면 label로 이동 if_icmpge Int1>=int2이면 label로 이동 if_icmpgt Int1>int2이면 label로 이동 if_icmple Int1<=int2이면 label로 이동
Ex) Loop : iload_0 bipush 20 if_icmpeq break iinc 0 1 goto loop break:
Ex) bipush 42 bipush 26 isub ifeq same_as_zero 니모닉 인자 스택 효과 ifeq label int1 Int1==0이면 label로 이동 Ifne Int1!=0이면 label로 이동 Iflt Int1<0이면 label로 이동 Ifge Int1>=0이면 label로 이동 Ifgt Int1>0이면 label로 이동 ifle Int1<=0이면 label로 이동 Ex) bipush 42 bipush 26 isub ifeq same_as_zero
*주어진 레이블로 이동하는 것은 하나의 메소드안에서만 가능하고, 따라서 하나의 클래스 안에서 같은 이름의 레이블을 여러 번 사용하는 것이 가능 Ex) .method doSomething() V Loop: goto Loop .end method .method bigBranch()V goto Loop ;에러발생 return .method someOtherMethod ()V .end mehtod
5.2 참조자간의 비교 니모닉 인자 스택 효과 if_acmpeq label ref1 ref2 ref1 참조자가 ref2참조자와 같으면 label로 이동 if_acmpne ref1 참조자가 ref2참조자와 같지않으면 label로 이동 Ifnonnull ref1 ref1 참조자가 null이 아니면 label로 이동 ifnull ref1 참조자가 null이면 label로 이동
Ex) aload_0 if_acmpeq success getstatic Cookie/chocolateChip LCookie; ifnull nocookie ;
5.3 다른 비교 명령어들 니모닉 스택 효과 dcmpg double1 double 2 double1==double2=>0 둘 중하나가 NaN=>1 dcmpl 둘 중하나가 NaN=>-1 fcmpg float1 float2 float1==float2=>0 float1<float2=>-1 float1>float2=>1 두 값이 모두 NaN=>1 fcmpl 두 값이 모두 NaN=>-1 lcmp long1 long2 long1==long2=>0 long1<long2=>-1 long1>long2=>1
5.4 switch명령어 lookupswitch tableswitch -1 -1:less less 0:equal equal 1:greater greater default: fail default: fail * 스택의 최상단에 있는 값이 주어진 값과 일치하지 않을 경우, default뒤에 나오는 레이블로 분기하기 위해 default값은 맨 마지막에 항상 적어 주어야한다.
5.5 서브루틴 Jsr : 분기가 시작된 위치(return address)가 스택의 최상단에 위치 메소드의 여러 부분에서 쓰이는 명령어들을 한 곳에 모아 서브 루틴을 만들 때 사용 – 인자전달은 할 수 없지만, 새로운 스택프 레임을 만들지 않음 state1: jsr get_next_character lookupswitch 65:state1 66:state2 default:state3 get_next_character: astore_3 ret_3
5.6 예외(Exception) 프로그램수행도중 예외발생->athrow명령어는 java/lang/Throwable의 서브클래스의 객체를 피연산자로 하여 예외를 던짐 ->active exception handler active exception handler가 존재하지 않는 경우 : JVM은 메소드를 종료하고 메소드를 호출한 부분에서 예외 핸들러를 찾음.
.class BedtimeRoutine .method goToBed()V .catch SnackException from begin to end using handler invokestatic BedtimeRoutine/putOnPajamas()V begin: invokestatic BedtimeRoutine/haveMidnightSnack()V end: Invokestatic BedtimeRoutine/brushTeeth()V return handler: .end method .method static haveMidnightSnack()V getstatic Refrigerator/midlkQuantity I Ifgt drink_milk new SnackException dup Ldc “Out of milk” Invokespecial SnackException/<init> (Ljava/lang/String)V Athrow ………
5.6.1 여러 개의 예외핸들러 Throwable Error Exception 예외클래스
invokestatic BedtimeRoutine/putonPajamas()V begin2: .catch SnackException from begin2 to end2 using handler2 .catch java/lang/Expcetion from begin1 to end1 using handler1 begin1: invokestatic BedtimeRoutine/putonPajamas()V begin2: invokestatic BedtimeRoutine/haveMidnightSnack()V end2: invokestatic BedtimeRoutine/brushTeeth()V end1: return handler2: handler1:
5.6.2 .trows지시자 .thorws - 메소드에서 어떠한 예외가 던져질 수 있는지를 경고 Ex) .method lateNightSnack()V .throws OutofMilkException .throws OutofCookiesException
5.7 instanceof checkcast instanceof 객체를 주어진 타입으로 바꿀수 없는 경우 ClassCastException을 발생 객체가 주어진 타입과 같을 경우 1, 다른 경우 0을 푸시 객체를 주어진 타입으로 변경 객체가 주어진 타입과 같은지 비교 ->피연산자를 스택으로부터 제거
invokevirtual Movies/getStooge()Lstooge; dup instanceof Curly ifeq notCurly checkcast Curly return notCurly: