Java 바이트 코드 명령 목록

List of Java bytecode instructions

Java 바이트코드를 구성하는 명령 목록입니다. Java 바이트코드는 Java [1]가상 머신에 의해 최종적으로 실행되는 추상 머신 언어입니다.Java 바이트 코드는 Java Platform에서 실행되는 언어, 특히 Java 프로그래밍 언어에서 생성됩니다.

참조되는 모든 "값"은 Java 명령 집합에 따라 32비트 int를 참조합니다.

니모닉 오퍼코드
(16진수)
Opcode(2진수) 기타 바이트
[카운트]:[오퍼랜드 라벨]
스택
[전]→[후]
묘사
알로드 32 0011 0010 arrayref, 인덱스 → 값 배열에서 참조를 스택에 로드하다
스토어 53 0101 0011 arrayref, 인덱스, 값 → 참조를 배열에 저장하다
aconst_internal. 01 0000 0001 →특수 참조를 스택에 밀어넣다
알로드 19 0001 1001 1: 인덱스 → objectref 로컬 변수 #index에서 스택에 참조를 로드합니다.
알로드_0 2a 0010 1010 → objectref 참조를 로컬 변수 0에서 스택으로 로드합니다.
알로드_1 2b 0010 1011 → objectref 로컬 변수 1에서 스택에 참조를 로드합니다.
알로드_2 2c 0010 1100 → objectref 참조를 로컬 변수 2에서 스택으로 로드합니다.
알로드_3 2D 0010 1101 → objectref 로컬 변수 3에서 스택에 참조를 로드합니다.
아네와레이 bd 1011 1101 2: indexbyte1, indexbyte2 카운트 → arrayref 클래스 참조 인덱스로 식별된 길이 수 및 구성요소 유형의 참조 배열을 새로 만듭니다(상수 풀의 indexbyte1 < <8 indexbyte2)
회전하다 b0 1011 0000 objectref → [비어 있음] 메서드에서 참조를 반환하다
어레이 길이 있다 1011 1110 arrayref → 길이 배열의 길이를 파악하다
아스토어 3a 0011 1010 1: 인덱스 objectref → 참조를 로컬 변수 #색인에 저장합니다.
아스토어_0 4b 0100 1011 objectref → 참조를 지역 변수 0에 저장
아스토어_1 4c 0100 1100 objectref → 참조를 지역 변수 1에 저장합니다.
아스토어_2 4D 0100 1101 objectref → 참조를 로컬 변수 2에 저장합니다.
아스토어_3 4e 0100 1110 objectref → 참조를 로컬 변수 3에 저장하다
애스로 bf 1011 1111 objectref → [ empty ], objectref 에러 또는 예외를 발생시킵니다(스택의 나머지 부분은 클리어되고 슬로우 가능에 대한 참조만 남습니다).
키보드 33 0011 0011 arrayref, 인덱스 → 값 배열에서 바이트 또는 부울 값 로드
스토어 54 0101 0100 arrayref, 인덱스, 값 → 바이트 또는 부울 값을 배열에 저장하다
바이푸시 10 0001 0000 1: 바이트 → 값 바이트정수로 스택에 푸시하다
중단점 ca 1100 1010 Java 디버거의 중단점용으로 예약되어 있으며 클래스 파일에 표시되지 않아야 합니다.
열량 34 0011 0100 arrayref, 인덱스 → 값 배열에서 문자를 로드하다
캐스토어 55 0101 0101 arrayref, 인덱스, 값 → 문자를 배열에 저장하다
체크캐스트 c0 1100 0000 2: indexbyte1, indexbyte2 objectref → objectref objectref가 특정 유형이며 클래스 참조가 인덱스(indexbyte1 < 8 indexbyte2)의 상수 풀에 있는지 여부를 확인합니다.
d2f 90 1001 0000 값 → 결과 더블플로트로 변환하다
d2i 8e 1000 1110 값 → 결과 더블을 int로 변환하다
d2l 8층 1000 1111 값 → 결과 2루타를 롱으로 바꾸다
아버지 63 0110 0011 value1, value2 → 결과 더블을 두 개 추가하다
달로드 31 0011 0001 arrayref, 인덱스 → 값 배열에서 2루타를 날리다
스토어 52 0101 0010 arrayref, 인덱스, 값 → 2루타를 배열에 저장하다
dcmpg 98 1001 1000 value1, value2 → 결과 2개의 복식 비교(NaN에서 1개)
dcmpl 97 1001 0111 value1, value2 → 결과 2개의 복식 비교, NaN에서 -1
dconst_0 0e 0000 1110 → 0.0 상수 0.0(이중)을 스택에 밀어넣다
dconst_1 0f 0000 1111 → 1.0 1.0(이중)을 스택에 밀어넣다
ddiv 6층 0110 1111 value1, value2 → 결과 복식 두 개를 나누다
로드 18 0001 1000 1: 인덱스 → 값 로컬 변수 #index에서 이중 값을 로드합니다.
dload_0 26 0010 0110 → 값 로컬 변수 0에서 더블을 로드하다
dload_1 27 0010 0111 → 값 로컬 변수 1에서 더블을 로드하다
dload_2 28 0010 1000 → 값 로컬 변수 2에서 더블을 로드하다
dload_3 29 0010 1001 → 값 로컬 변수 3에서 더블을 로드하다
dmul 6b 0110 1011 value1, value2 → 결과 두 배로 늘리다
인식하다 77 0111 0111 값 → 결과 더블을 부정하다
메모리 73 0111 0011 value1, value2 → 결과 두 복식 사이의 나눗셈에서 나머지를 얻다
되돌아가다 af 1010 1111 값 → [비어 있음] 메서드에서 더블을 반환하다
스토어 39 0011 1001 1: 인덱스 값 → 로컬 변수 #인덱스에 이중 값을 저장합니다.
dstore_0 47 0100 0111 값 → 지역 변수 0에 이중 저장
dstore_1 48 0100 1000 값 → 지역 변수 1에 2배수를 저장하다
dstore_2 49 0100 1001 값 → 지역 변수 2에 2배수를 저장하다
dstore_3 4a 0100 1010 값 → 지역 변수 3에 더블을 저장하다
서브 67 0110 0111 value1, value2 → 결과 2루타를 빼다
이중 59 0101 1001 값 → 값, 값 스택 상단에 값을 복제하다
dup_x1 5a 0101 1010 value2, value1 → value1, value2, value1 맨 위에서 두 개의 값을 스택에 삽입합니다. value1과 value2는 double 또는 long 유형이어서는 안 됩니다.
dup_x2 5b 0101 1011 value3, value2, value1 → value1, value3, value2, value1 최상위 값의 복사본을 스택2에 삽입(value2가 2배 또는 긴 경우 value3의 엔트리를 차지)하거나 3개의 값(value2가 2배 또는 긴 경우)
듀프2 5c 0101 1100 {value2, value1} → {value2, value1}, {value2, value1} 상위 2개의 스택워드 중복(value1이 더블 또는 롱이 아닌 경우 2개의 값, value1이 더블 또는 롱인 경우 1개의 값)
dup2_x1 5d 0101 1101 value3, {value2, value1} → {value2, value1}, value3, {value2, value1} 두 단어를 중복하여 세 번째 단어 아래에 삽입(위 설명 참조)
dup2_x2 5e 0101 1110 {value4, value3}, {value2, value1} → {value2, value1}, {value4, value3}, {value2, value1} 두 단어를 복제하여 네 번째 단어 아래에 삽입하다
f2d 8d 1000 1101 값 → 결과 플로트를 더블로 변환하다
f2i 8b 1000 1011 값 → 결과 플로트를 int로 변환하다
f2l 8c 1000 1100 값 → 결과 플로트를 롱으로 변환하다
패드 62 0110 0010 value1, value2 → 결과 수레 두 개를 보태다
팔로드 30 0011 0000 arrayref, 인덱스 → 값 배열에서 플로트를 싣다
패스트스토어 51 0101 0001 arrayref, 인덱스, 값 → 플로트를 배열에 저장하다
fcmpg 96 1001 0110 value1, value2 → 결과 2개의 플로트를 비교한다(NaN에 1개).
fcmpl 95 1001 0101 value1, value2 → 결과 두 플로트를 비교한다(NaN에서 -1).
fconst_0 0b 0000 1011 → 0.0f 스택에 0.0f를 푸시하다
fconst_1 0c 0000 1100 → 1.0f 스택에 1.0f 푸시
fconst_2 0d 0000 1101 → 2.0f 스택 상에서 2.0f 푸시
fdiv 6e 0110 1110 value1, value2 → 결과 수레 두 개를 나누다
플로피 17 0001 0111 1: 인덱스 → 값 로컬 변수 #index에서 float 값을 로드합니다.
플로피_0 22 0010 0010 → 값 local 변수 0에서 float 값을 로드합니다.
플로피_1 23 0010 0011 → 값 로컬 변수 1에서 플로트 값을 로드합니다.
플로피_2 24 0010 0100 → 값 로컬 변수 2에서 플로트 값을 로드합니다.
플로피_3 25 0010 0101 → 값 로컬 변수 3에서 플로트 값을 로드합니다.
fmul 6a 0110 1010 value1, value2 → 결과 플로트 두 개를 증식하다
부정 76 0111 0110 값 → 결과 부동선을 무효로 하다.
프렘 72 0111 0010 value1, value2 → 결과 두 플로트의 분할로 나머지를 얻다
되돌아가다 아에 1010 1110 값 → [비어 있음] 수레를 돌려주다.
fstore 38 0011 1000 1: 인덱스 값 → float 값을 로컬 변수 #index에 저장합니다.
fstore_0 43 0100 0011 값 → float 값을 지역 변수 0에 저장합니다.
fstore_1 44 0100 0100 값 → 플로트 값을 로컬 변수 1에 저장합니다.
fstore_2 45 0100 0101 값 → 플로트 값을 로컬 변수 2에 저장합니다.
fstore_3 46 0100 0110 값 → float 값을 지역 변수 3에 저장
fsub 66 0110 0110 value1, value2 → 결과 플로트 두 개를 빼다
취득 필드 b4 1011 0100 2: indexbyte1, indexbyte2 objectref → 값 objectref 필드 값을 가져옵니다.여기서 필드는 상수 풀인덱스(indexbyte1 <8 indexbyte2)의 필드 참조로 식별됩니다.
정전기 b2 1011 0010 2: indexbyte1, indexbyte2 → 값 클래스의 정적 필드 값을 가져옵니다.여기서 필드는 상수 풀인덱스(indexbyte1 <8 indexbyte2)의 필드 참조로 식별됩니다.
에 가다 a7 1010 0111 2: branchbyte1, branchbyte2 [변화 없음] branchoffset의 다른 명령으로 이동합니다(부호 없는 바이트 branchbyte1 <8 branchbyte2에서 작성된 signed short).
goto_w c8 1100 1000 4: branchbyte1, branchbyte2, branchbyte3, branchbyte4 [변화 없음] branchoffset의 다른 명령으로 이동합니다(부호 없는 바이트 branchbyte1 < 24 branchbyte2 < 16 branchbyte3 <8 branchbyte4 )
i2b 91 1001 0001 값 → 결과 int를 바이트로 변환하다
i2c 92 1001 0010 값 → 결과 int를 문자로 변환하다
i2d 87 1000 0111 값 → 결과 int를 2배로 변환하다
i2f 86 1000 0110 값 → 결과 int를 플로트로 변환하다
i2l 85 1000 0101 값 → 결과 int를 long으로 변환하다
i2s 93 1001 0011 값 → 결과 int를 short로 변환하다
추가 60 0110 0000 value1, value2 → 결과 두 개의 int를 추가하다
이루아도 2e 0010 1110 arrayref, 인덱스 → 값 배열에서 int를 로드하다
그리고 7e 0111 1110 value1, value2 → 결과 두 정수에 대해 비트 단위로 AND를 수행합니다.
스토어 4층 0100 1111 arrayref, 인덱스, 값 → 배열에 int를 저장하다
iconst_m1 02 0000 0010 → -1 int 값 -1을 스택에 로드합니다.
iconst_0 03 0000 0011 → 0 int 값 0을 스택에 로드합니다.
아이콘_1 04 0000 0100 → 1 int 값 1을 스택에 로드합니다.
아이콘_2 05 0000 0101 → 2 int 값 2를 스택에 로드하다
아이콘_3 06 0000 0110 → 3 int 값 3을 스택에 로드하다
아이콘_4 07 0000 0111 → 4 int 값 4를 스택에 로드합니다.
아이콘_5 08 0000 1000 → 5 int 값 5를 스택에 로드하다
아이디브 6c 0110 1100 value1, value2 → 결과 두 정수를 나누다
if_acmpeq a5 1010 0101 2: branchbyte1, branchbyte2 value1, value2 → 참조가 같을 경우 branch offset에서 branch to 명령(부호 없는 바이트 branchbyte1 <8 branchbyte2)으로 구성된 signed short)
if_acmpne a6 1010 0110 2: branchbyte1, branchbyte2 value1, value2 → 참조가 동일하지 않은 경우 branchoffset에서 branch to 명령(부호 없는 바이트 branchbyte1 <8 branchbyte2)으로 구성된 signed short)
if_icmpeq 9층 1001 1111 2: branchbyte1, branchbyte2 value1, value2 → int가 같을 경우 branch offset에서 branch-to-instruction(부호 없는 바이트 branchbyte1 <8 branchbyte2에서 작성된 signed short)
if_icmpge a2 1010 0010 2: branchbyte1, branchbyte2 value1, value2 → value1value2보다 크거나 같으면 branchoffset에서 명령으로 분기합니다(부호 없는 바이트 branchbyte1 <8 branchbyte2에서 작성된 서명 쇼트).
if_icmpgt a3 1010 0011 2: branchbyte1, branchbyte2 value1, value2 → value1value2보다 클 경우 branchoffset에서 명령으로 분기합니다(부호 없는 바이트 branchbyte1 <8 branchbyte2로 구성된 서명 쇼트).
if_icmple a4 1010 0100 2: branchbyte1, branchbyte2 value1, value2 → value1value2보다 작거나 같으면 branchoffset(부호 없는 바이트 branchbyte1 <8 branchbyte2로 구성된 signed short)에서 명령으로 분기합니다.
if_icmplt a1 1010 0001 2: branchbyte1, branchbyte2 value1, value2 → value1value2보다 작을 경우 branchoffset(부호 없는 바이트 branchbyte1 <8 branchbyte2로 구성된 signed short)에서 명령으로 분기합니다.
if_icmpne a0 1010 0000 2: branchbyte1, branchbyte2 value1, value2 → int가 같지 않은 경우 branch offset에서 branch to 명령(부호 없는 바이트 branchbyte1 <8 branchbyte2)으로 구성된 signed short)
ifeq 99 1001 1001 2: branchbyte1, branchbyte2 값 → 값이 0인 경우 branchoffset(부호 없는 바이트 branchbyte1 <8 branchbyte2)에서 branch-offset 명령으로 분기합니다.
ifge 9c 1001 1100 2: branchbyte1, branchbyte2 값 → 값이 0보다 크거나 같으면 branchoffset에서 branch to 명령으로 분기합니다(부호 없는 바이트 branchbyte1 <8 branchbyte2에서 작성된 signed short).
ifgt 9d 1001 1101 2: branchbyte1, branchbyte2 값 → 값이 0보다 클 경우 branchoffset에서 명령으로 분기합니다(부호 없는 바이트 branchbyte1 <8 branchbyte2에서 작성된 서명 쇼트).
아이플 9e 1001 1110 2: branchbyte1, branchbyte2 값 → 값이 0 이하일 경우 branchoffset에서 branch to 명령(부호 없는 바이트 branchbyte1 <8 branchbyte2)으로 구성된 signed short)
이면 9b 1001 1011 2: branchbyte1, branchbyte2 값 → 값이 0보다 작을 경우 branch offset에서 branch to 명령(부호 없는 바이트 branchbyte1 <8 branchbyte2)으로 구성된 signed short)
동작하고 있다 9a 1001 1010 2: branchbyte1, branchbyte2 값 → 값이 0이 아닌 경우 branchoffset에서 branch to 명령(부호 없는 바이트 branchbyte1 <8 branchbyte2)으로 구성된 signed short)
무효인 경우 c7 1100 0111 2: branchbyte1, branchbyte2 값 → 값이 null이 아닌 경우 branchoffset(부호 없는 바이트 branchbyte1 <8 branchbyte2)에서 branch-offset 명령으로 분기합니다.
무효 c6 1100 0110 2: branchbyte1, branchbyte2 값 → 값이 늘인 경우 branchoffset에서 명령으로 분기합니다(부호 없는 바이트 branchbyte1 <8 branchbyte2에서 작성된 서명 쇼트).
인크 84 1000 0100 2: 인덱스, 고정 [변화 없음] 로컬 변수 #index를 부호 있는 바이트 상수별로 증가시킵니다.
로드하다 15 0001 0101 1: 인덱스 → 값 로컬 변수 #index에서 int 값을 로드합니다.
iload_0 1a 0001 1010 → 값 로컬 변수 0에서 int 값을 로드합니다.
iload_1 1b 0001 1011 → 값 로컬 변수 1에서 int 값을 로드합니다.
iload_2 1c 0001 1100 → 값 로컬 변수 2에서 int 값을 로드합니다.
iload_3 1d 0001 1101 → 값 로컬 변수 3에서 int 값을 로드합니다.
impdep1 fe 1111 1110 디버거 내의 구현 의존형 작업용으로 예약되어 있으며 클래스 파일에는 표시되지 않습니다.
impdep2 ff 1111 1111 디버거 내의 구현 의존형 작업용으로 예약되어 있으며 클래스 파일에는 표시되지 않습니다.
이물 68 0110 1000 value1, value2 → 결과 두 정수를 곱하다
인식되지 않다 74 0111 0100 값 → 결과 부정하다
인스턴스 c1 1100 0001 2: indexbyte1, indexbyte2 objectref → 결과 objectref가 상수 풀(indexbyte1 <8 indexbyte2)의 클래스 참조 인덱스로 식별되는 특정 유형인지 여부를 판별합니다.
발기된 1011 1010 4: indexbyte1, indexbyte2, 0, 0 [param1, arg2, ...] → 결과 다이내믹 메서드를 호출하여 결과를 스택에 저장합니다(비활성일 수 있음).메서드는 상수 풀의 메서드레퍼런스인덱스(indexbyte1 <8 indexbyte2)에 의해 식별됩니다.
호출 인터페이스 b9 1011 1001 4: indexbyte1, indexbyte2, 카운트, 0 objectref, [subject1, arg2, ...] → 결과 objectref에서 인터페이스 메서드를 호출하여 결과를 스택에 저장합니다(비활성일 수 있음).인터페이스 메서드는 상수 풀의 메서드레퍼런스인덱스(indexbyte1 <8 indexbyte2)에 의해 식별됩니다.
특별하다 b7 1011 0111 2: indexbyte1, indexbyte2 objectref, [subject1, arg2, ...] → 결과 objectref에서 인스턴스 메서드를 호출하여 결과를 스택에 저장합니다(비활성일 수 있음). 메서드는 상수 풀의 메서드 참조 인덱스(indexbyte1 <8 indexbyte2)에 의해 식별됩니다.
정체성이 없는 b8 1011 1000 2: indexbyte1, indexbyte2 [param1, arg2, ...] → 결과 스태틱 메서드를 호출하여 결과를 스택에 저장합니다(비활성일 수 있음). 메서드는 상수 풀의 메서드레퍼런스 인덱스에 의해 식별됩니다(indexbyte1 <8 indexbyte2).
가상 호출 b6 1011 0110 2: indexbyte1, indexbyte2 objectref, [subject1, arg2, ...] → 결과 objectref에서 가상 메서드를 호출하고 결과를 스택에 배치합니다(비활성일 수 있음). 메서드는 상수 풀의 메서드 참조 인덱스(indexbyte1 <8 indexbyte2)로 식별됩니다.
또는 80 1000 0000 value1, value2 → 결과 비트 단위 int OR
70 0111 0000 value1, value2 → 결과 논리적인 나머지
되돌아가다 ac 1010 1100 값 → [비어 있음] 메서드에서 정수를 반환하다
이슐 78 0111 1000 value1, value2 → 결과 int shift 왼쪽
인식하다 7a 0111 1010 value1, value2 → 결과 int 산술 시프트 오른쪽
스토어 36 0011 0110 1: 인덱스 값 → 변수 #indexint 값 저장
istore_0 3b 0011 1011 값 → 변수 0에 int 값 저장
istore_1 3c 0011 1100 값 → 변수 1에 int 값 저장
istore_2 3D 0011 1101 값 → 변수 2에 int 값 저장
istore_3 3e 0011 1110 값 → 변수 3에 int 값 저장
아이서브 64 0110 0100 value1, value2 → 결과 int 빼기
플래시 7c 0111 1100 value1, value2 → 결과 int 논리 이동권
또는 82 1000 0010 value1, value2 → 결과 내부
jsr a8 1010 1000 2: branchbyte1, branchbyte2 → 주소 branchoffset(부호 없는 바이트 branchbyte1 <8 branchbyte2에서 작성된 signed short)에서 서브루틴으로 점프하여 반환 주소를 스택에 배치합니다.
jsr_w c9 1100 1001 4: branchbyte1, branchbyte2, branchbyte3, branchbyte4 → 주소 branchoffset(부호 없는 바이트 branchbyte1 < 24 branchbyte2 < 16 branchbyte3 <8 branchbyte4 >에서 작성된 서명된 int)에서 서브루틴으로 점프하여 반환 주소를 스택에 배치합니다.
l2d 8a 1000 1010 값 → 결과 롱을 더블로 변환하다
l2f 89 1000 1001 값 → 결과 롱을 플로트로 변환하다
l2i 88 1000 1000 값 → 결과 long을 int로 변환하다
로드 61 0110 0001 value1, value2 → 결과 롱 두 개를 더하다
로드 2f 0010 1111 arrayref, 인덱스 → 값 배열에서 장척을 장전하다
7층 0111 1111 value1, value2 → 결과 개의 긴 AND 비트
라스토어 50 0101 0000 arrayref, 인덱스, 값 → 길게 늘어놓다
lcmp 94 1001 0100 value1, value2 → 결과 2개의 길이가 같으면 0을, value1이 value2보다 크면 1을, 그렇지 않으면 -1을 누릅니다.
lconst_0 09 0000 1001 → 0L 0L(타입이 긴 숫자 0)을 스택에 푸시합니다.
lconst_1 0a 0000 1010 → 1L 1L(타입이 긴 번호)를 스택에 밀어넣습니다.
ldc 12 0001 0010 1: 인덱스 → 값 상수 풀(String, int, float, Class, java.lang.invoke)에서 상수 #index를 푸시합니다.MethodType, java.lang.invoke.스택에 대한 MethodHandle 또는 동적으로 계산된 상수)
ldc_w 13 0001 0011 2: indexbyte1, indexbyte2 → 값 상수 풀(String, int, float, Class, java.lang.invoke)에서 상수 #index를 푸시합니다.MethodType, java.lang.invoke.스택에 대한 MethodHandle 또는 동적으로 계산된 상수(넓은 인덱스는 indexbyte1 <8 indexbyte2)로 구성됩니다.
ldc2_w 14 0001 0100 2: indexbyte1, indexbyte2 → 값 상수 풀(더블, 롱 또는 다이내믹하게 변환된 상수)에서 스택으로 상수 #인덱스를 푸시합니다(넓은 인덱스는 indexbyte1 <8 indexbyte2).
ldiv 6d 0110 1101 value1, value2 → 결과 두 장으로 나누다
로드 16 0001 0110 1: 인덱스 → 값 로컬 변수 #index에서 긴 값을 로드합니다.
load_0 1e 0001 1110 → 값 로컬 변수 0에서 긴 값을 로드하다
load_1 1f 0001 1111 → 값 로컬 변수 1에서 긴 값을 로드하다
load_2 20 0010 0000 → 값 로컬 변수 2에서 긴 값을 로드하다
load_3 21 0010 0001 → 값 로컬 변수 3에서 긴 값을 로드하다
lmul 69 0110 1001 value1, value2 → 결과 롱을 두 번 곱하다
인식하다 75 0111 0101 값 → 결과 오랫동안 부정하다.
룩스위치 AB 1010 1011 8+: <0~3바이트 패딩>, defaultbyte1, defaultbyte2, defaultbyte3, defaultbyte4, npairs1, npairs2, npairs3, npairs4, match-pairs 쌍... 키 → 대상 주소는 키를 사용하여 테이블에서 검색되며 해당 주소의 명령에서 실행이 계속됩니다.
81 1000 0001 value1, value2 → 결과 두 개의 긴 비트의 OR
71 0111 0001 value1, value2 → 결과 두 장수의 나머지 분할
되돌아가다 광고 1010 1101 값 → [비어 있음] 장기간의 가치를 반환하다
lshl 79 0111 1001 value1, value2 → 결과 값1의 왼쪽 비트 이동 int 값2 위치
shrr 7b 0111 1011 value1, value2 → 결과 의 오른쪽 비트 이동1 int 값 2 위치
스토어 37 0011 0111 1: 인덱스 값 → 로컬 변수 #index에 긴 을 저장합니다.
lstore_0 3f 0011 1111 값 → 로컬 변수 0에 긴 을 저장합니다.
lstore_1 40 0100 0000 값 → 로컬 변수 1에 긴 을 저장합니다.
lstore_2 41 0100 0001 값 → 로컬 변수 2에 긴 을 저장합니다.
lstore_3 42 0100 0010 값 → 로컬 변수 3에 긴 을 저장하다
서브 65 0110 0101 value1, value2 → 결과 롱 두 개를 빼다
러시 7d 0111 1101 value1, value2 → 결과 의 비트 이동1을 int 값 2개 위치, 부호 없음
표시하다 83 1000 0011 value1, value2 → 결과 2개의 롱 비트 단위 XOR
모니터 c2 1100 0010 objectref → 오브젝트의 monitor를 입력합니다("잠금 해제" – synchronized() 섹션의 시작).
모니터 렉시트 c3 1100 0011 objectref → 오브젝트 종료 모니터("잠금 해제") – synchronized() 섹션의 끝)
복수 전쟁 c5 1100 0101 3: 인덱스바이트1, 인덱스바이트2, 치수 count1, [count2,...] → arrayref 상수 풀 인덱스(indexbyte1 < 8 indexbyte2)에서 클래스 참조로 식별되는 유형의 치수 배열을 새로 만듭니다. 각 치수의 크기는 count1, [count2 등]으로 식별됩니다.
신규 bb 1011 1011 2: indexbyte1, indexbyte2 → objectref 상수 인덱스에서 클래스 참조로 식별되는 유형의 새 개체를 만듭니다(indexbyte1 < 8 indexbyte2).
새로운 배열 bc 1011 1100 1: atype 카운트 → arrayref atype으로 식별되는 기본 유형의 카운트 요소를 사용하여 새 어레이 생성
하지 않다 00 0000 0000 [변화 없음] 수술을 하지 않다
57 0101 0111 값 → 스택 상단의 값을 파기하다
팝2 58 0101 1000 {value2, value1} → 스택의 상위 2개의 값(또는 더블 또는 롱의 경우 1개의 값)을 폐기합니다.
풋필드 b5 1011 0101 2: indexbyte1, indexbyte2 objectref, 값 → objectref에서 필드를 으로 설정합니다.여기서 필드는 상수 풀의 필드 참조 인덱스로 식별됩니다(indexbyte1 <8 indexbyte2).
정전기 b3 1011 0011 2: indexbyte1, indexbyte2 값 → static 필드를 클래스의 값으로 설정합니다.여기서 필드는 상수 풀의 필드 참조 인덱스로 식별됩니다(indexbyte1 <8 indexbyte2).
리트 a9 1010 1001 1: 인덱스 [변화 없음] 로컬 변수 #index에서 가져온 주소에서 실행을 계속합니다(jsr과의 비대칭은 의도적임).
돌아가다 b1 1011 0001 → [비어 있음] 방법에서 무효를 반환하다
살로드 35 0011 0101 arrayref, 인덱스 → 값 어레이에서 로드 부족
스토어 56 0101 0110 arrayref, 인덱스, 값 → 격납되어 있지 않다
사이푸시 11 0001 0001 2: 바이트1, 바이트2 → 값 단락을 정수로 스택에 밀어넣다
바꾸다 5f 0101 1111 value2, value1 → value1, value2 스택의 2개의 톱 워드를 스왑합니다(value1과 value2는 더블 또는 롱으로 할 수 없습니다).
테이블 스위치 aa 1010 1010 16+: [0~3바이트 패딩], defaultbyte1, defaultbyte2, defaultbyte3, defaultbyte4, lowbyte1, highbyte2, highbyte3, highbyte4, jump offsets... 인덱스 → 테이블 내의 주소에서 오프셋 인덱스로 실행을 계속하다
넓은 c4 1100 0100 3/5: opcode, indexbyte1, indexbyte2
또는
iinc, indexbyte1, indexbyte2, countbyte1, countbyte2
[해당 지시사항과 동일] execute opcode(opcode는 iload, fload, dload, istore, fstore, astore, lstore, dstore 또는 ret) 중 하나이지만 인덱스가 16비트이고 증분하는 상수가 16비트인 경우 execute iinc를 실행합니다.
(이름 없음) cb-internal(cb-interface) 이러한 값은 현재 opcode용으로 할당 해제되어 있으며 향후 사용을 위해 예약되어 있습니다.

Java 7(메이저 클래스 버전 51)[2]에서는 권장되지 않습니다.컴파일러에서 생성된 클래스 파일에는 표시되지 않습니다. ret명시적으로 권장되지 않지만, 이 기능이 없으면 무용지물입니다.jsr그리고.jsr_w동작 코드

「 」를 참조해 주세요.

  • Jazelle DBX(Direct Bytecode eXecution).일부 ARM9 CPU 상에서 하드웨어에서 Java 바이트 코드를 실행하는 기능입니다.
  • Common Intermediate Language(CIL; 공통 중간 언어).의 CLR에서 실행되는 동일한 바이트 코드 사양입니다.NET 프레임워크

레퍼런스

  1. ^ "The Java® Virtual Machine Specification – Java SE 12 Edition". Retrieved May 22, 2021.
  2. ^ "Chapter 4. The class File Format 4.9.1. Static Constraints". Retrieved May 22, 2021.

외부 링크