mnemonic : 작업 수행, opcode들이 mnemonic
- dup : stack의 탑을 스택에 복제,
directive : 지시어, assembler에게 지정하는 명령어, .으로 시작
opcode(operator)
operand
- bytecode instruction list (참고(http://en.wikipedia.org/wiki/Java_bytecode_instruction_listings))
- new mnemonic과 invokespecial 다른점
- new는 객체를 메모리에 할당,
- invokespecial <init>은 할당된 객체를 초기화
- invokestatic은 this가 필요없다!
# invokevirtual
- invokespecial VS invokevirtual
invokespecial
- invokespecial은 스택의 top를 파라메터로 받고, 스택의 top에서 두번째를 this(init의 주체)로 쓴다. <- dup를 하는 이유
- 생성자는void return
invokevirtual
- 모든 객체의 함수는 invokevirtual
- virtual이란 실행될 함수를 compile 시간에 결정할 수 없고 run time에 결정. (vtable lookup, c는 virtual 함수만 vtable에 기록됨)
invokeinterface
- 구체 클래스를 this로 받아야함
- 레퍼런스 타입 (참고(http://en.wikipedia.org/wiki/Java_bytecode))
Ljava/io/
InputStream <- java/io/
InputStream의 레퍼런스
- 스택에 객체의 주소가 들어있음. premitive 변수가 아니면 전부 레퍼런스 타입
- 메서드의 위치를 나타낼때는 java/io/
InputStream/read 이런식으로.
int : I
int[] : [I
String : Ljava/lang/string;
String[][] : [[Ljava/lang/string;
java/lang/string.length(V)I <- bytecode는 알수없는 코드로 구분, jasmin은 /로 구분
() 괄호안에 파라메터
astore_# <- 코드에 선언된 #번째 지역변수에 저장.
aload_# <- 코드에 선언된 #번째 지역변수에 저장된 값을 가져옴.
* (1+2)*3.1을 jasmin assembly로 나타내면
getstatic java/lang/system/out Ljava/io/printstream;
iconst_1
iconst_2
iadd
i2d
ldc 3.1
dmul
invokevirtual java/io/printstream/print(D)V
return