티스토리 뷰

공부자료

[자바고급] 바이트코드 뜯어보기 1

임다솜 임다솜 2017.03.19 20:39



Example01.java

package chapter02;

/**
* Created by dasom on 2017-03-19.
*/
public class Example01 {
public static void main(String[] args) {
int year = 0;
int age = 14;

year = age + 2000;
age = age +1;
}
}


Example01.class

// 윗부분 생략


public static main([Ljava/lang/String;)V
L0
LINENUMBER 8 L0
ICONST_0
ISTORE 1
L1
LINENUMBER 9 L1
BIPUSH 14
ISTORE 2
L2
LINENUMBER 11 L2
ILOAD 2
SIPUSH 2000
IADD
ISTORE 1
L3
LINENUMBER 12 L3
ILOAD 2
ICONST_1
IADD
ISTORE 2
L4
LINENUMBER 13 L4
RETURN
L5
LOCALVARIABLE args [Ljava/lang/String; L0 L5 0
LOCALVARIABLE year I L1 L5 1
LOCALVARIABLE age I L2 L5 2
MAXSTACK = 2
MAXLOCALS = 3
}



L0



int year = 0;


L0
LINENUMBER 8 L0
ICONST_0
ISTORE 1


ICONST_0

Operand Stack에 0을 PUSH한다.

유사한 명령어로 ICONST_1, ICONST_2, ..., ICONST_5가 있다. 각각 1부터 5까지의 숫자를 스택에 PUSH하는 명령어이다.

Operand Stack : [ 0 ]


ISTORE 1

Operand Stack을 POP하여 값을 가져온 뒤, 1번 변수에 저장한다.

여기서는 year에 0을 넣는 행위가 되겠다.

Operand Stack : [  ]



L1



int age = 14;


L1
LINENUMBER 9 L1
BIPUSH 14
ISTORE 2


BIPUSH 14

Push one-byte signed integer.

1바이트의 Signed Integer값을 Operand Stack에 PUSH한다. 

여기서는 14를 스택에 넣게 된다. 

Operand Stack : [ 14 ]


ISTORE 2

이번엔 스택에서 14를 POP하여 2번에 해당하는 age 변수에 저장한다.

Operand Stack : [  ]



L2



year = age + 2000;


L2
LINENUMBER 11 L2
ILOAD 2
SIPUSH 2000
IADD
ISTORE 1


ILOAD 2

2번 지역변수에 있는 값을 꺼내와 Operand Stack에 PUSH한다.

Operand Stack : [ 14 ]


SIPUSH 2000

Push 2 byte signed integer

2000을 Operand Stack에 PUSH한다.

Operand Stack : [ 14 > 2000 ]


IADD

Operand Stack에서 두 개의 값을 POP하여 꺼낸 뒤, 두 값을 더하여 결과값을 다시 Stack에 PUSH한다.

Operand Stack : [ 2014 ]


ISTORE 1

Operand Stack에서 POP하여 가져온 값을 1번 변수에 저장한다.

Operand Stack : [  ]

 


L3



age = age +1;


L3
LINENUMBER 12 L3
ILOAD 2
ICONST_1
IADD
ISTORE 2


ILOAD 2

2번 지역변수에 있는 값을 꺼내와 Operand Stack에 PUSH한다.

Operand Stack : [ 14 ]


ICONST_1

Operand Stack에 1을 PUSH한다.

Operand Stack : [ 14 > 1 ]


IADD

Operand Stackd에서 두개의 값을 POP하여 가져온 뒤, 더하여 결과값을 PUSH한다.

Operand Stack : [ 15 ]


ISTORE 2

Operand Stack에서 POP하여 가져온 값을 2번 지역변수에 저장한다.

Operand Stack : [ ]



L4


    }

L4
LINENUMBER 13 L4
RETURN


RETURN

메서드를 리턴한다. Operand Stack의 모든 값은 삭제된다.




댓글
댓글쓰기 폼
공지사항
Total
37,943
Today
34
Yesterday
56
링크
TAG
more
«   2018/05   »
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31    
글 보관함