1. Java
자바 탄생의 목적은 실제적으로는 가전제품에 사용할 소프트웨어를 만들기 위해 였다. 가전제품에 적용 되는 작은 내장형시스템(embedded system)에 맞는 요구사항을 충족해야만 했고, 이에 따른 플랫폼 독립적인 (platform independent) 새로운 언어와 실행 체계를 개발해야만 했다.
목적에 부합하는 언어가 만들어지기 위해서는 각기 다른 플랫폼에 하나하나 맞춤형으로 만들어지거나, 아예 플랫폼에는 상관없이 독립적인 형태로 만들어져야 했다.
자바는 OS나 H/W에 상관없이 자바가 실행될 수 있는 환경이 갖추어지게 된다면 모든 플랫폼에서 바로 실행이 가능하다. 이 실행이 가능한 특성을 WORA (Wirte Once Run Anywhere)이라고하며, WORA를 가능하게 해주고 플랫폼의 종속성에서 벗어나게 해주는 자바의 특징으로 자바 (.Java 확장자) 코드를 컴파일한 코드(.Class 확장자)인 '바이트 코드(byte code)'와 JVM (Java Virtual Machine)의 두가지 특징이 있다.
바이트 코드의 특징은 다음과 같다.
1. 자바 소스를 컴파일한 목적 코드
2. CPU에 종속적이지 않은 중립적인 코드
3. JVM에 의해 해석되고 실행됨
다음으로 JVM은 Java소스를 컴파일한 바이트코드, 즉 class 파일을 실행시키는 자바 자체의 새로운 실행체계이다. 이 실행 체계는 인터프리터 방식으로 바이트 코드를 해석하여 실행 시킨다. (Java에 반대로 JVM은 플랫폼 종속적이라고 할 수 있다.)
이 두가지 특징으로 Java는 OS나 H/W에 상관없이 플랫폼 독립성을 만족시킬 수 있게된다.
smali 코드와 직접적인 연관이 있는 것은 바이트 코드라고 할 수 있으며, Class 파일로 존재하는 바이트 코드를 JDK (Java Development Kit)을 통해 디스어셈블(disassemble)하여 우리가 볼 수 있는 중간적인 언어로 만들어 준다.
바이트 코드는 이진수로 구성이 되어 있으며 가시적으로 보기 힘이들다. JDK로 디스어셈블 하는것은 C언어에서 기계어와 C언어 사이에 어셈블리어가 존재하는 것과 같다고 할 수 있다.
smali의 또 다른 이름은 "dalvik opcode" 이다.
2. Smali 문법
아래의 표는 인터넷 서핑중 이 부분에 대해 잘 정리해 주신 분이 계셔서 퍼왔습니다.
Copyright : http://modapk.tistory.com/13
달빅 바이트코드 (Dalvik Bytecode)
# 4비트 레지스터는 v0에서 v15까지의 범위에 있어야 합니다.
# 8비트 레지스터는 v0에서 v255까지의 범위에 있어야 합니다.
# 16비트 레지스터는 v0에서 v65535까지의 범위에 있어야 합니다.
# long/double은 64비트 연산을 사용합니다.
# 64비트 연산에는 접미사 wide가 붙습니다.
# 64비트 연산은 2개의 레지스터(레지스터 쌍)를 사용합니다.
# from16은 16비트 레지스터 참조 연산을 나타냅니다.
00 - nop
아무것도 하지 않습니다.
nop
안해
01 - move vA, vB
A: 목적지 레지스터 (4비트), B: 소스 레지스터 (4비트)
vA에 비객체 vB의 값을 복사합니다.
move v0, v1
v0에 v1의 값을 복사합니다.
02 - move/from16 vA, vB
A: 목적지 레지스터 (8비트), B: 소스 레지스터 (16비트)
vA에 비객체 vB의 값을 복사합니다.
move/from16 v0, v1
v0에 v1의 값을 복사합니다.
03 - move/16 vA, vB
A: 목적지 레지스터 (16비트), B: 소스 레지스터 (16비트)
vA에 비객체 vB의 값을 복사합니다.
move/16 v0, v1
v0에 v1의 값을 복사합니다.
04 - move-wide vA, vB
A: 목적지 레지스터 (4비트), B: 소스 레지스터 쌍 (4비트)
vA에 비객체 vB, vB+1의 값(long/double)을 복사합니다.
move-wide v0, v1
v0에 v1, v2의 값(long/double)을 복사합니다.
05 - move-wide/from16 vA, vB
A: 목적지 레지스터 (8비트), B: 소스 레지스터 쌍 (16비트)
vA에 비객체 vB, vB+1의 값(long/double)을 복사합니다.
move-wide/from16 v0, v1
v0에 v1, v2의 값(long/double)을 복사합니다.
06 - move-wide/16 vA, vB
A: 목적지 레지스터 (16비트), B: 소스 레지스터 쌍 (16비트)
vA에 비객체 vB, vB+1의 값(long/double)을 복사합니다.
move-wide/16 v0, v1
v0에 v1, v2의 값(long/double)을 복사합니다.
07 - move-object vA, vB
A: 목적지 레지스터 (4비트), B: 소스 레지스터 (4비트)
vA에 객체 참조 vB를 복사합니다.
move-object v0, v1
v0에 객체 참조 v1을 복사합니다.
08 - move-object/from16 vA, vB
A: 목적지 레지스터 (8비트), B: 소스 레지스터 (16비트)
vA에 객체 참조 vB를 복사합니다.
move-object/from16 v0, v1
v0에 객체 참조 v1을 복사합니다.
09 - move-object/16 vA, vB
A: 목적지 레지스터 (16비트), B: 소스 레지스터 (16비트)
vA에 객체 참조 vB를 복사합니다.
move-object/16 v0, v1
v0에 객체 참조 v1을 복사합니다.
0A - move-result vA
A: 목적지 레지스터 (8비트)
vA에 가장 최근 invoke-종류 함수의 결과를 복사합니다.
move-result v0
v0에 가장 최근 invoke-종류 함수의 결과를 복사합니다.
0B - move-result-wide vA
A: 목적지 레지스터 쌍 (8비트)
vA, vA+1에 가장 최근 invoke-종류 함수의 결과(long/double)를 복사합니다.
move-result-wide v0
v0, v1에 가장 최근 invoke-종류 함수의 결과(long/double)를 복사합니다.
0C - move-result-object vA
A: 목적지 레지스터 (8비트)
vA에 가장 최근 invoke-종류 함수의 결과(객체 참조)를 복사합니다.
move-result-object v0
v0에 가장 최근 invoke-종류 함수의 결과(객체 참조)를 복사합니다.
0D - move-exception vA
A: 목적지 레지스터 (8비트)
vA에 invoke-종류 함수에서 던져진 예외 객체 참조를 복사합니다.
move-exception v0
v0에 invoke-종류 함수에서 던져진 예외 객체 참조를 복사합니다.
0E - return-void
void 메소드에서 아무 값 없이 리턴합니다.
return-void
아무 값 없이 리턴합니다.
0F - return vA
A: 리턴 값 레지스터 (8비트)
vA의 값을 리턴합니다.
return v0
v0의 값을 리턴합니다.
10 - return-wide vA
A: 리턴 값 레지스터 쌍 (8비트)
vA, vA+1의 값(long/double)을 리턴합니다.
return-wide v0
v0, v1의 값(long/double)을 리턴합니다.
11 - return-object vA
A: 리턴 값 레지스터 (8비트)
vA의 값(객체 참조)을 리턴합니다.
return-object v0
v0의 값(객체 참조)을 리턴합니다.
12 - const/4 vA, B
A: 목적지 레지스터 (4비트), B: signed int (4비트)
vA에 B의 리터럴 값을 넣습니다. 범위는 -0x8에서 0x7까지입니다.
const/4 v0, 0x7
v0에 7을 넣습니다.
13 - const/16 vA, B
A: 목적지 레지스터 (8비트), B: signed int (16비트)
vA에 B의 리터럴 값을 넣습니다. 범위는 -0x8000에서 0x7fff까지입니다.
const/16 v0, 0x7fff
v0에 32767을 넣습니다.
14 - const vA, B
A: 목적지 레지스터 (8비트), B: signed int (32비트)
vA에 B의 리터럴 값을 넣습니다. 범위는 -0x80000000에서 0x7fffffff까지입니다.
const v0, 0x7fffffff
v0에 2147483647을 넣습니다.
15 - const/high16 vA, B
A: 목적지 레지스터 (8비트), B: signed int (16비트)
vA에 B의 리터럴 값을 넣습니다. 범위는 -0x80000000에서 0x7fff0000까지이고, 뒤의 4자리가 0입니다. float 값을 초기화하는데 사용합니다.
const/high16 v0, 0x41200000
v0에 (float) 10.0을 넣습니다.
16 - const-wide/16 vA, B
A: 목적지 레지스터 쌍 (8비트), B: signed int (16비트)
vA, vA+1에 B의 리터럴 값을 넣습니다. 범위는 -0x8000에서 0x7fff까지입니다.
const-wide/16 v0, 0x7fff
v0, v1에 (long) 32767을 넣습니다.
17 - const-wide/32 vA, B
A: 목적지 레지스터 쌍 (8비트), B: signed int (32비트)
vA, vA+1에 B의 리터럴 값을 넣습니다. 범위는 -0x80000000에서 0x7fffffff까지입니다.
const-wide/32 v0, 0x7fffffff
v0, v1에 (long) 2147483647을 넣습니다.
18 - const-wide vA, B
A: 목적지 레지스터 쌍 (8비트), B: signed int (64비트)
vA, vA+1에 B의 리터럴 값을 넣습니다. 범위는 -0x8000000000000000L에서 0x7FFFFFFFFFFFFFFFL까지입니다.
const-wide v0, 0x7FFFFFFFFFFFFFFFL
v0, v1에 (long) 9223372036854775807을 넣습니다.
19 - const-wide/high16 vA, B
A: 목적지 레지스터 쌍 (8비트), B: signed int (16비트)
vA, vA+1에 B의 리터럴 값을 넣습니다. 범위는 -0x8000000000000000L에서 0x7fff000000000000L까지이고, 뒤의 12자리가 0입니다. double 값을 초기화하는데 사용합니다.
const-wide/high16 v0, 0x4024000000000000L
v0, v1에 (double) 10.0을 넣습니다.
1A - const-string vA, "B"
A: 목적지 레지스터 (8비트), B: 문자열 인덱스
vA에 문자열 B를 넣습니다.
const-string v0, "abc"
v0에 문자열 abc를 넣습니다.
1B - const-string/jumbo vA, "B"
A: 목적지 레지스터 (8비트), B: 문자열 인덱스
vA에 문자열 B를 넣습니다. 문자열이 65536개 이상일 때 사용합니다.
const-string/jumbo v0, "abc"
v0에 문자열 abc를 넣습니다.
1C - const-class vA, B
A: 목적지 레지스터 (8비트), B: 타입 인덱스
vA에 타입 B에 대한 참조를 넣습니다.
const-class v0, Landroid/app/ActionBar;
v0에 ActionBar.class에 대한 참조를 넣습니다.
1D - monitor-enter vA
A: 참조 레지스터 (8비트)
vA에 참조된 객체의 모니터를 획득합니다.
monitor-enter v0
v0에 참조된 객체의 모니터를 획득합니다.
1E - monitor-exit
A: 참조 레지스터 (8비트)
vA에 참조된 객체의 모니터를 해제합니다.
monitor-exit v0
v0에 참조된 객체의 모니터를 해제합니다.
1F - check-cast vA, B
A: 참조 레지스터 (8비트), B: 타입 인덱스 (16비트)
참조 vA가 타입 B를 캐스팅할 수 있는지 체크하고, 불가능하면 ClassCastException을 던집니다.
check-cast v0, Landroid/app/ActionBar;
v0가 ActionBar.class를 캐스팅할 수 있는지 체크하고, 불가능하면 ClassCastException을 던집니다.
20 - instance-of vA, vB, C
A: 목적지 레지스터 (4비트), B: 참조 레지스터 (4비트), C: 타입 인덱스 (16비트)
참조 vB가 타입 C의 인스턴스이면 vA에 1을 저장합니다. 그렇지 않으면 0을 저장합니다.
instance-of v0, v1, Landroid/app/ActionBar;
v1이 ActionBar.class의 인스턴스이면 v0에 1을 저장합니다. 그렇지 않으면 0을 저장합니다.
21 - array-length vA, vB
A: 목적지 레지스터 (4비트), B: 배열 참조 레지스터 (4비트)
vB에 참조된 배열의 길이를 vA에 저장합니다.
array-length v0, v1
v1에 참조된 배열의 길이를 v0에 저장합니다.
22 - new-instance vA, B
A: 목적지 레지스터 (8비트), B: 타입 인덱스
타입 B의 인스턴스를 생성하고, 그 참조를 vA에 저장합니다.
new-instance v0, Landroid/app/ActionBar;
ActionBar.class의 인스턴스를 생성하고, 그 참조를 v0에 저장합니다.
23 - new-array vA, vB, C
A: 목적지 레지스터 (8비트), B: 크기 레지스터, C: 타입 인덱스
vA에 vB의 크기를 가지는 배열 C를 생성합니다.
new-array v0, v1, [I
v0에 v1의 크기를 가지는 배열 [I를 생성합니다.
24 - filled-new-array , B
B: 타입 인덱스 (16비트), C~G: 인자 (각각 4비트)
C~G의 인자들로 채워진 새로운 배열 B를 생성합니다. 인자는 long/double이 아니어야 합니다. 바로 뒤에 move-result-object로 결과를 저장할 수 있습니다.
filled-new-array , [I
v0~v2의 인자들로 채워진 크기 3의 배열 [I을 생성합니다. 바로 뒤에 move-result-object로 결과를 저장할 수 있습니다.
25 - filled-new-array/range , B
A: 배열 크기, 인자 개수 (8비트), B: 타입 인덱스 (16비트), C: 첫번째 인자 (각각 16비트), N=A+C-1
C~N의 인자들로 채워진 새로운 배열 B를 생성합니다. 인자는 long/double이 아니어야 합니다. 바로 뒤에 move-result-object로 결과를 저장할 수 있습니다.
filled-new-array/range , [La/b/c;
v0~v6의 인자들로 채워진 크기 7의 배열 [La/b/c;을 생성합니다. 바로 뒤에 move-result-object로 결과를 저장할 수 있습니다.
26 - fill-array-data vA, B
A: 배열 레지스터 (8비트), B: 데이터 테이블 분기 오프셋 (32비트)
테이블에 있는 데이터로 배열 vA을 채웁니다. 배열의 크기와 데이터의 개수가 일치해야 합니다.
fill-array-data v0, :array_a
:array_a
.array-data 1
0x0
0x1
0x2
.end array-data
27 - throw vA
A: 예외 레지스터 (8비트)
예외 객체 참조 vA를 던집니다.
throw v0
예외 객체 참조 v0를 던집니다.
28 - goto A
A: 분기 오프셋 (8비트)
무조건 A로 점프합니다. A는 0이 아니어야 합니다.
goto :goto_1
:goto_1
무조건 :goto_1로 점프합니다.
29 - goto/16 A
A: 분기 오프셋 (16비트)
무조건 A로 점프합니다. A는 0이 아니어야 합니다.
goto/16 :goto_1
:goto_1
무조건 :goto_1으로 점프합니다.
2A - goto/32 A
A: 분기 오프셋 (32비트)
무조건 A로 점프합니다.
goto/32 :goto_1
:goto_1
무조건 :goto_1로 점프합니다.
2B - packed-switch vA, B
A: 레지스터 B: 데이터 테이블 분기 오프셋 (32비트)
데이터 테이블에 vA의 각 값에 해당하는 오프셋이 순서대로 나열되어 있고, 해당하는 오프셋으로 점프하여 명령을 실행합니다. 해당하는 오프셋이 없으면 다음 명령을 실행합니다.
packed-switch v0, :pswitch_data_12
const-string v1, "a"
:goto_5
return-object v1
:pswitch_3
const-string v1, "b"
goto :goto_5
:pswitch_6
const-string v1, "c"
goto :goto_5
:pswitch_9
const-string v1, "d"
goto :goto_5
:pswitch_data_12
.packed-switch 0x1
:pswitch_6
:pswitch_9
:pswitch_3
:pswitch_6
:pswitch_3
.end packed-switch
v0의 값이 1이면 :pswitch_6으로, 2면 :pswitch_9으로, 3이면 :pswitch_3으로, 4면 :pswitch_6으로, 5면 :pswitch_3으로 점프하여 명령을 실행합니다. 해당하는 오프셋이 없으면 다음 명령을 실행합니다.
2C - sparse-switch vA, B
A: 레지스터 B: 데이터 테이블 분기 오프셋 (32비트)
데이터 테이블에서 vA의 각 값에 해당하는 오프셋을 찾아서, 해당하는 오프셋으로 점프하여 명령을 실행합니다. 해당하는 오프셋이 없으면 다음 명령을 실행합니다.
sparse-switch v0, :sswitch_data_18
const-string v1, "a"
:goto_4
return-object v1
:sswitch_5
const-string v1, "b"
goto :goto_4
:sswitch_8
const-string v1, "c"
goto :goto_4
:sswitch_b
const-string v1, "d"
goto :goto_4
:sswitch_data_18
.sparse-switch
0x1 -> :sswitch_5
0x2 -> :sswitch_8
0x4 -> :sswitch_b
.end sparse-switch
v0의 값이 0x1이면 :sswitch_5으로, 0x2면 :sswitch_8으로, 0x4면 :sswitch_b으로 점프하여 명령을 실행합니다. 해당하는 오프셋이 없으면 다음 명령을 실행합니다.
2D - cmpl-float vA, vB, vC
A: 목적지 레지스터 (8비트), B: 소스 레지스터, C: 소스 레지스터
vB와 vC의 값(float)을 비교하여 vA에 리턴합니다. vB가 vC보다 작으면 -1을 리턴합니다.
cmpl-float v0, v1, v2
v1이 v2보다 작으면 v0에 -1을 리턴합니다.
2E - cmpg-float vA, vB, vC
A: 목적지 레지스터 (8비트), B: 소스 레지스터, C: 소스 레지스터
vB와 vC의 값(float)을 비교하여 vA에 리턴합니다. vB가 vC보다 크면 1을 리턴합니다.
cmpg-float v0, v1, v2
v1이 v2보다 크면 v0에 1을 리턴합니다.
2F - cmpl-double vA, vB, vC
A: 목적지 레지스터 (8비트), B: 소스 레지스터 쌍, C: 소스 레지스터 쌍
vB, vB+1과 vC, vC+1의 값(double)을 비교하여 vA에 리턴합니다. vB, vB+1이 vC, vC+1보다 작으면 -1을 리턴합니다.
cmpl-double v0, v1, v3
v1, v2가 v3, v4보다 작으면 v0에 -1을 리턴합니다.
30 - cmpg-double vA, vB, vC
A: 목적지 레지스터 (8비트), B: 소스 레지스터 쌍, C: 소스 레지스터 쌍
vB, vB+1과 vC, vC+1의 값(double)을 비교하여 vA에 리턴합니다. vB, vB+1이 vC, vC+1보다 크면 1을 리턴합니다.
cmpg-double v0, v1, v3
v1, v2가 v3, v4보다 크면 v0에 1을 리턴합니다.
31 - cmp-long vA, vB, vC
A: 목적지 레지스터 (8비트), B: 소스 레지스터 쌍, C: 소스 레지스터 쌍
vB, vB+1과 vC, vC+1의 값(long)을 비교하여 vA에 리턴합니다. vB, vB+1가 vC, vC+1와 같으면 0을, 작으면 -1을, 크면 1을 리턴합니다.
cmp-long v0, v1, v3
v1, v2가 v3, v4와 같으면 v0에 0을, 작으면 v0에 -1을, 크면 v0에 1을 리턴합니다.
32 - if-eq vA, vB, C
A: 레지스터 (4비트), B: 레지스터 (4비트), C: 분기 오프셋 (16비트)
vA와 vB가 같으면 C로 점프합니다.
if-eq v0, v1, :cond_1
:cond_1
v0==v1이면 :cond_1로 점프합니다.
33 - if-ne vA, vB, C
A: 레지스터 (4비트), B: 레지스터 (4비트), C: 분기 오프셋 (16비트)
vA와 vB가 같지 않으면 C로 점프합니다.
if-ne v0, v1, :cond_1
:cond_1
v0!=v1이면 :cond_1로 점프합니다.
34 - if-lt vA, vB, C
A: 레지스터 (4비트), B: 레지스터 (4비트), C: 분기 오프셋 (16비트)
vA가 vB보다 작으면 C로 점프합니다.
if-lt v0, v1, :cond_1
:cond_1
v0<v1이면 :cond_1로 점프합니다.
35 - if-ge vA, vB, C
A: 레지스터 (4비트), B: 레지스터 (4비트), C: 분기 오프셋 (16비트)
vA가 vB보다 크거나 같으면 C로 점프합니다.
if-ge v0, v1, :cond_1
:cond_1
v0>=v1이면 :cond_1로 점프합니다.
36 - if-gt vA, vB, C
A: 레지스터 (4비트), B: 레지스터 (4비트), C: 분기 오프셋 (16비트)
vA가 vB보다 크면 C로 점프합니다.
if-gt v0, v1, :cond_1
:cond_1
v0>v1이면 :cond_1로 점프합니다.
37 - if-le vA, vB, C
A: 레지스터 (4비트), B: 레지스터 (4비트), C: 분기 오프셋 (16비트)
vA가 vB보다 작거나 같으면 C로 점프합니다.
if-le v0, v1, :cond_1
:cond_1
v0<=v1이면 :cond_1로 점프합니다.
38 - if-eqz vA, B
A: 레지스터 (8비트), B: 분기 오프셋 (16비트)
vA가 0이면 C로 점프합니다.
if-eqz v0, :cond_1
:cond_1
v0==0이면 :cond_1로 점프합니다.
39 - if-nez vA, B
A: 레지스터 (8비트), B: 분기 오프셋 (16비트)
vA가 0이 아니면 C로 점프합니다.
if-eqz v0, :cond_1
:cond_1
v0!=0이면 :cond_1로 점프합니다.
3A - if-ltz vA, B
A: 레지스터 (8비트), B: 분기 오프셋 (16비트)
vA가 0보다 작으면 C로 점프합니다.
if-ltz v0, :cond_1
:cond_1
v0<0이면 :cond_1로 점프합니다.
3B - if-gez vA, B
A: 레지스터 (8비트), B: 분기 오프셋 (16비트)
vA가 0보다 크거나 같으면 C로 점프합니다.
if-gez v0, :cond_1
:cond_1
v0>=0이면 :cond_1로 점프합니다.
3C - if-gtz vA, B
A: 레지스터 (8비트), B: 분기 오프셋 (16비트)
vA가 0보다 크면 C로 점프합니다.
if-gtz v0, :cond_1
:cond_1
v0>0이면 :cond_1로 점프합니다.
3D - if-lez vA, B
A: 레지스터 (8비트), B: 분기 오프셋 (16비트)
vA가 0보다 작거나 같으면 C로 점프합니다.
if-lez v0, :cond_1
:cond_1
v0<=0이면 :cond_1로 점프합니다.
3E - unused_3E
3F - unused_3F
40 - unused_40
41 - unused_41
42 - unused_42
43 - unused_43
44 - aget vA, vB, vC
A: 레지스터 (8비트), B: 배열 레지스터 (8비트), C: 인덱스 레지스터 (8비트)
배열 vB에서 특정 인덱스(C)의 요소(int)를 vA로 가져옵니다.
aget v0, v1, v2
배열 v1에서 인덱스 v2의 요소(int)를 v0로 가져옵니다.
45 - aget-wide vA, vB, vC
A: 레지스터 쌍 (8비트), B: 배열 레지스터 (8비트), C: 인덱스 레지스터 (8비트)
배열 vB에서 특정 인덱스(C)의 요소(long/double)를 vA, vA+1로 가져옵니다.
aget-wide v0, v2, v3
배열 v2에서 인덱스 v3의 요소(long/double)를 v0, v1로 가져옵니다.
46 - aget-object vA, vB, vC
A: 레지스터 (8비트), B: 배열 레지스터 (8비트), C: 인덱스 레지스터 (8비트)
배열 vB에서 특정 인덱스(C)의 요소(object)를 vA로 가져옵니다.
aget-object v0, v1, v2
배열 v1에서 인덱스 v2의 요소(object)를 v0로 가져옵니다.
47 - aget-boolean vA, vB, vC
A: 레지스터 (8비트), B: 배열 레지스터 (8비트), C: 인덱스 레지스터 (8비트)
배열 vB에서 특정 인덱스(C)의 요소(boolean)를 vA로 가져옵니다.
aget-boolean v0, v1, v2
배열 v1에서 인덱스 v2의 요소(boolean)를 v0로 가져옵니다.
48 - aget-byte vA, vB, vC
A: 레지스터 (8비트), B: 배열 레지스터 (8비트), C: 인덱스 레지스터 (8비트)
배열 vB에서 특정 인덱스(C)의 요소(byte)를 vA로 가져옵니다.
aget-byte v0, v1, v2
배열 v1에서 인덱스 v2의 요소(byte)를 v0로 가져옵니다.
49 - aget-char vA, vB, vC
A: 레지스터 (8비트), B: 배열 레지스터 (8비트), C: 인덱스 레지스터 (8비트)
배열 vB에서 특정 인덱스(C)의 요소(char)를 vA로 가져옵니다.
aget-char v0, v1, v2
배열 v1에서 인덱스 v2의 요소(char)를 v0로 가져옵니다.
4A - aget-short vA, vB, vC
A: 레지스터 (8비트), B: 배열 레지스터 (8비트), C: 인덱스 레지스터 (8비트)
배열 vB에서 특정 인덱스(C)의 요소(short)를 vA로 가져옵니다.
aget-short v0, v1, v2
배열 v1에서 인덱스 v2의 요소(short)를 v0로 가져옵니다.
4B - aput vA, vB, vC
A: 레지스터 (8비트), B: 배열 레지스터 (8비트), C: 인덱스 레지스터 (8비트)
vA의 값(int)을 배열 vB의 특정 인덱스(C)에 넣습니다.
aput v0, v1, v2
v0의 값(int)을 배열 v1의 인덱스 v2에 넣습니다.
4C - aput-wide vA, vB, vC
A: 레지스터 쌍 (8비트), B: 배열 레지스터 (8비트), C: 인덱스 레지스터 (8비트)
vA, vA+1의 값(long/double)을 배열 vB의 특정 인덱스(C)에 넣습니다.
aput-wide v0, v2, v3
v0, v1의 값(long/double)을 배열 v2의 인덱스 v3에 넣습니다.
4D - aput-object vA, vB, vC
A: 레지스터 (8비트), B: 배열 레지스터 (8비트), C: 인덱스 레지스터 (8비트)
vA의 값(object)을 배열 vB의 특정 인덱스(C)에 넣습니다.
aput-object v0, v1, v2
v0의 값(object)을 배열 v1의 인덱스 v2에 넣습니다.
4E - aput-boolean vA, vB, vC
A: 레지스터 (8비트), B: 배열 레지스터 (8비트), C: 인덱스 레지스터 (8비트)
vA의 값(boolean)을 배열 vB의 특정 인덱스(C)에 넣습니다.
aput-boolean v0, v1, v2
v0의 값(boolean)을 배열 v1의 인덱스 v2에 넣습니다.
4F - aput-byte vA, vB, vC
A: 레지스터 (8비트), B: 배열 레지스터 (8비트), C: 인덱스 레지스터 (8비트)
vA의 값(byte)을 배열 vB의 특정 인덱스(C)에 넣습니다.
aput-byte v0, v1, v2
v0의 값(byte)을 배열 v1의 인덱스 v2에 넣습니다.
50 - aput-char vA, vB, vC
A: 레지스터 (8비트), B: 배열 레지스터 (8비트), C: 인덱스 레지스터 (8비트)
vA의 값(char)을 배열 vB의 특정 인덱스(C)에 넣습니다.
aput-char v0, v1, v2
v0의 값(char)을 배열 v1의 인덱스 v2에 넣습니다.
51 - aput-short vA, vB, vC
A: 레지스터 (8비트), B: 배열 레지스터 (8비트), C: 인덱스 레지스터 (8비트)
vA의 값(short)을 배열 vB의 특정 인덱스(C)에 넣습니다.
aput-short v0, v1, v2
v0의 값(short)을 배열 v1의 인덱스 v2에 넣습니다.
52 - iget vA, vB, C
A: 레지스터 (4비트), B: 객체 레지스터 (4비트), C: 인스턴스 필드 (16비트)
vB의 인스턴스 필드 C(int)를 vA로 가져옵니다.
iget v0, v1, La/b/c/d;->a:I
v1의 인스턴스 필드 a:I를 v0으로 가져옵니다.
53 - iget-wide vA, vB, C
A: 레지스터 쌍 (4비트), B: 객체 레지스터 (4비트), C: 인스턴스 필드 (16비트)
vB의 인스턴스 필드 C(long/double)를 vA, vA+1로 가져옵니다.
iget-wide v0, v2, La/b/c/d;->b:J
v2의 인스턴스 필드 b:J를 v0, v1으로 가져옵니다.
54 - iget-object vA, vB, C
A: 레지스터 (4비트), B: 객체 레지스터 (4비트), C: 인스턴스 필드 (16비트)
vB의 인스턴스 필드 C(object)를 vA로 가져옵니다.
iget-object v0, v1, La/b/c/d;->c:La/b/c/e;
v1의 인스턴스 필드 c:La/b/c/e;를 v0으로 가져옵니다.
55 - iget-boolean vA, vB, C
A: 레지스터 (4비트), B: 객체 레지스터 (4비트), C: 인스턴스 필드 (16비트)
vB의 인스턴스 필드 C(boolean)를 vA로 가져옵니다.
iget-boolean v0, v1, La/b/c/d;->d:Z
v1의 인스턴스 필드 d:Z를 v0으로 가져옵니다.
56 - iget-byte vA, vB, C
A: 레지스터 (4비트), B: 객체 레지스터 (4비트), C: 인스턴스 필드 (16비트)
vB의 인스턴스 필드 C(byte)를 vA로 가져옵니다.
iget-byte v0, v1, La/b/c/d;->e:B
v1의 인스턴스 필드 e:B를 v0으로 가져옵니다.
57 - iget-char vA, vB, C
A: 레지스터 (4비트), B: 객체 레지스터 (4비트), C: 인스턴스 필드 (16비트)
vB의 인스턴스 필드 C(char)를 vA로 가져옵니다.
iget-char v0, v1, La/b/c/d;->f:C
v1의 인스턴스 필드 f:C를 v0으로 가져옵니다.
58 - iget-short vA, vB, C
A: 레지스터 (4비트), B: 객체 레지스터 (4비트), C: 인스턴스 필드 (16비트)
vB의 인스턴스 필드 C(short)를 vA로 가져옵니다.
iget-short v0, v1, La/b/c/d;->g:S
v1의 인스턴스 필드 g:S를 v0으로 가져옵니다.
59 - iput vA, vB, C
A: 레지스터 (4비트), B: 객체 레지스터 (4비트), C: 인스턴스 필드 (16비트)
vA의 값(int)을 vB의 인스턴스 필드 C에 넣습니다.
iput v0, v1, La/b/c/d;->a:I
v0의 값(int)을 v1의 인스턴스 필드 a:I에 넣습니다.
5A - iput-wide vA, vB, C
A: 레지스터 쌍 (4비트), B: 객체 레지스터 (4비트), C: 인스턴스 필드 (16비트)
vA, vA+1의 값(long/double)을 vB의 인스턴스 필드 C에 넣습니다.
iput-wide v0, v2, La/b/c/d;->b:J
v0, v1의 값(long/double)을 v2의 인스턴스 필드 b:J에 넣습니다.
5B - iput-object vA, vB, C
A: 레지스터 (4비트), B: 객체 레지스터 (4비트), C: 인스턴스 필드 (16비트)
vA의 값(object)을 vB의 인스턴스 필드 C에 넣습니다.
iput-object v0, v1, La/b/c/d;->c:La/b/c/e;
v0의 값(object)을 v1의 인스턴스 필드 c:La/b/c/e;에 넣습니다.
5C - iput-boolean vA, vB, C
A: 레지스터 (4비트), B: 객체 레지스터 (4비트), C: 인스턴스 필드 (16비트)
vA의 값(boolean)을 vB의 인스턴스 필드 C에 넣습니다.
iput-boolean v0, v1, La/b/c/d;->d:Z
v0의 값(boolean)을 v1의 인스턴스 필드 d:Z에 넣습니다.
5D - iput-byte vA, vB, C
A: 레지스터 (4비트), B: 객체 레지스터 (4비트), C: 인스턴스 필드 (16비트)
vA의 값(byte)을 vB의 인스턴스 필드 C에 넣습니다.
iput-byte v0, v1, La/b/c/d;->e:B
v0의 값(byte)을 v1의 인스턴스 필드 e:B에 넣습니다.
5E - iput-char vA, vB, C
A: 레지스터 (4비트), B: 객체 레지스터 (4비트), C: 인스턴스 필드 (16비트)
vA의 값(char)을 vB의 인스턴스 필드 C에 넣습니다.
iput-char v0, v1, La/b/c/d;->f:C
v0의 값(char)을 v1의 인스턴스 필드 f:C에 넣습니다.
5F - iput-short vA, vB, C
A: 레지스터 (4비트), B: 객체 레지스터 (4비트), C: 인스턴스 필드 (16비트)
vA의 값(short)을 vB의 인스턴스 필드 C에 넣습니다.
iput-short v0, v1, La/b/c/d;->g:S
v0의 값(short)을 v1의 인스턴스 필드 g:S에 넣습니다.
60 - sget vA, B
A: 레지스터 (8비트), B: 정적 필드 (16비트)
정적 필드 vB(int)를 vA로 가져옵니다.
sget v0, La/b/c/d;->a:I
정적 필드 a:I를 v0으로 가져옵니다.
61 - sget-wide vA, B
A: 레지스터 쌍 (8비트), B: 정적 필드 (16비트)
정적 필드 vB(long/double)를 vA, vA+1로 가져옵니다.
sget-wide v0, La/b/c/d;->b:J
정적 필드 b:J를 v0, v1으로 가져옵니다.
62 - sget-object vA, B
A: 레지스터 (8비트), B: 정적 필드 (16비트)
정적 필드 vB(object)를 vA로 가져옵니다.
sget-object v0, La/b/c/d;->c:La/b/c/e;
정적 필드 c:La/b/c/e;를 v0으로 가져옵니다.
63 - sget-boolean vA, B
A: 레지스터 (8비트), B: 정적 필드 (16비트)
정적 필드 vB(boolean)를 vA로 가져옵니다.
sget-boolean v0, La/b/c/d;->d:Z
정적 필드 d:Z를 v0으로 가져옵니다.
64 - sget-byte vA, B
A: 레지스터 (8비트), B: 정적 필드 (16비트)
정적 필드 vB(byte)를 vA로 가져옵니다.
sget-byte v0, La/b/c/d;->e:B
정적 필드 e:B를 v0으로 가져옵니다.
65 - sget-char vA, B
A: 레지스터 (8비트), B: 정적 필드 (16비트)
정적 필드 vB(char)를 vA로 가져옵니다.
sget-char v0, La/b/c/d;->f:C
정적 필드 f:C를 v0으로 가져옵니다.
66 - sget-short vA, B
A: 레지스터 (8비트), B: 정적 필드 (16비트)
정적 필드 vB(short)를 vA로 가져옵니다.
sget-short v0, La/b/c/d;->g:S
정적 필드 g:S를 v0으로 가져옵니다.
67 - sput vA, B
A: 레지스터 (8비트), B: 정적 필드 (16비트)
vA의 값(int)을 정적 필드 vB에 넣습니다.
sput v0, La/b/c/d;->a:I
v0의 값(int)을 정적 필드 a:I에 넣습니다.
68 - sput-wide vA, B
A: 레지스터 쌍 (8비트), B: 정적 필드 (16비트)
vA, vA+1의 값(long/double)을 정적 필드 vB에 넣습니다.
sput-wide v0, La/b/c/d;->b:J
v0, v1의 값(long/double)을 정적 필드 b:J에 넣습니다.
69 - sput-object vA, B
A: 레지스터 (8비트), B: 정적 필드 (16비트)
vA의 값(object)을 정적 필드 vB에 넣습니다.
sput-object v0, La/b/c/d;->c:La/b/c/e;
v0의 값(object)을 정적 필드 c:La/b/c/e;에 넣습니다.
6A - sput-boolean vA, B
A: 레지스터 (8비트), B: 정적 필드 (16비트)
vA의 값(boolean)을 정적 필드 vB에 넣습니다.
sput-boolean v0, La/b/c/d;->d:Z
v0의 값(boolean)을 정적 필드 d:Z에 넣습니다.
6B - sput-byte vA, B
A: 레지스터 (8비트), B: 정적 필드 (16비트)
vA의 값(byte)을 정적 필드 vB에 넣습니다.
sput-byte v0, La/b/c/d;->e:B
v0의 값(byte)을 정적 필드 e:B에 넣습니다.
6C - sput-char vA, B
A: 레지스터 (8비트), B: 정적 필드 (16비트)
vA의 값(char)을 정적 필드 vB에 넣습니다.
sput-char v0, La/b/c/d;->f:C
v0의 값(char)을 정적 필드 f:C에 넣습니다.
6D - sput-short vA, B
A: 레지스터 (8비트), B: 정적 필드 (16비트)
vA의 값(short)을 정적 필드 vB에 넣습니다.
sput-short v0, La/b/c/d;->g:S
v0의 값(short)을 정적 필드 g:S에 넣습니다.
6E - invoke-virtual , B
B: 메소드 (16비트), C~G: 인자 (각각 4비트)
virtual 메소드 B를 호출합니다. 메소드는 private, static, final, constructor가 아니어야 합니다. vC는 메소드가 속해있는 클래스이고, vC가 p0이면 'this' 역할을 합니다. 만약 결과 값이 있으면 바로 뒤에 move-result-종류로 결과를 저장합니다.
invoke-virtual , La/b/c/d;->a(La/b/c/e;II)I
virtual 메소드 a(La/b/c/e;II)I를 호출합니다. 결과 값이 있으므로 바로 뒤에 move-result로 결과를 저장합니다.
6F - invoke-super , B
B: 메소드 (16비트), C~G: 인자 (각각 4비트)
상위 클래스의 virtual 메소드 B를 호출합니다. 메소드는 private, static, final, constructor가 아니어야 합니다. vC는 메소드가 속해있는 상위 클래스입니다. 만약 결과 값이 있으면 바로 뒤에 move-result-종류로 결과를 저장합니다.
invoke-super , La/b/c/d;->b()V
상위 클래스의 virtual 메소드 b()V를 호출합니다.
70 - invoke-direct , B
B: 메소드 (16비트), C~G: 인자 (각각 4비트)
direct 메소드 B를 호출합니다. 메소드는 private이거나 constructor입니다. vC는 메소드가 속해있는 클래스입니다. 만약 결과 값이 있으면 바로 뒤에 move-result-종류로 결과를 저장합니다.
invoke-direct , La/b/c/d;->c()V
direct 메소드 c()V를 호출합니다.
71 - invoke-static , B
B: 메소드 (16비트), C~G: 인자 (각각 4비트)
static 메소드 B를 호출합니다. B는 direct 메소드에 속해있습니다. 만약 결과 값이 있으면 바로 뒤에 move-result-종류로 결과를 저장합니다.
invoke-static , La/b/c/d;->d(I)La/b/c/e;
static 메소드 d(I)La/b/c/e;를 호출합니다. 결과 값이 있으므로 바로 뒤에 move-result-object로 결과를 저장합니다.
72 - invoke-interface , B
B: 메소드 (16비트), C~G: 인자 (각각 4비트)
interface 메소드 B를 호출합니다. B는 virtual 메소드에 속해있습니다. vC는 메소드가 속해있는 클래스입니다. 만약 결과 값이 있으면 바로 뒤에 move-result-종류로 결과를 저장합니다.
invoke-interface , La/b/c/d;->e(La/b/c/e;IZZ)V
interface 메소드 e(La/b/c/e;IZZ)V를 호출합니다.
73 - unused_73
74 - invoke-virtual/range , B
A: 인자 개수 (8비트), B: 메소드 (16비트), C: 첫번째 인자 (16비트), N=A+C-1
virtual 메소드 B를 호출합니다. 메소드는 private, static, final, constructor가 아니어야 합니다. vC는 메소드가 속해있는 클래스이고, vC가 p0이면 'this' 역할을 합니다. 만약 결과 값이 있으면 바로 뒤에 move-result-종류로 결과를 저장합니다.
invoke-virtual/range , La/b/c/d;->a(La/b/c/e;IILa/b/c/e;IIII)I
virtual 메소드 a(La/b/c/e;IILa/b/c/e;IIII)I를 호출합니다. 결과 값이 있으므로 바로 뒤에 move-result로 결과를 저장합니다.
75 - invoke-super/range , B
A: 인자 개수 (8비트), B: 메소드 (16비트), C: 첫번째 인자 (16비트), N=A+C-1
상위 클래스의 virtual 메소드 B를 호출합니다. 메소드는 private, static, final, constructor가 아니어야 합니다. vC는 메소드가 속해있는 상위 클래스입니다. 만약 결과 값이 있으면 바로 뒤에 move-result-종류로 결과를 저장합니다.
invoke-super/range , La/b/c/d;->b(ZIII)V
상위 클래스의 virtual 메소드 b(ZIII)V를 호출합니다.
76 - invoke-direct/range , B
A: 인자 개수 (8비트), B: 메소드 (16비트), C: 첫번째 인자 (16비트), N=A+C-1
direct 메소드 B를 호출합니다. 메소드는 private이거나 constructor입니다. vC는 메소드가 속해있는 클래스입니다. 만약 결과 값이 있으면 바로 뒤에 move-result-종류로 결과를 저장합니다.
invoke-direct/range , La/b/c/d;->c(La/b/c/e;IIII)V
direct 메소드 c(La/b/c/e;IIII)V를 호출합니다.
77 - invoke-static/range , B
A: 인자 개수 (8비트), B: 메소드 (16비트), C: 첫번째 인자 (16비트), N=A+C-1
static 메소드 B를 호출합니다. B는 direct 메소드에 속해있습니다. 만약 결과 값이 있으면 바로 뒤에 move-result-종류로 결과를 저장합니다.
invoke-static/range , La/b/c/d;->d(CICICICIZI)I
static 메소드 d(CICICICIZI)I를 호출합니다. 결과 값이 있으므로 바로 뒤에 move-result로 결과를 저장합니다.
78 - invoke-interface/range , B
A: 인자 개수 (8비트), B: 메소드 (16비트), C: 첫번째 인자 (16비트), N=A+C-1
interface 메소드 B를 호출합니다. B는 virtual 메소드에 속해있습니다. vC는 메소드가 속해있는 클래스입니다. 만약 결과 값이 있으면 바로 뒤에 move-result-종류로 결과를 저장합니다.
invoke-interface/range , La/b/c/d;->e()La/b/c/e;
interface 메소드 e()La/b/c/e;를 호출합니다. 결과 값이 있으므로 바로 뒤에 move-result-object로 결과를 저장합니다.
79 - unused_79
7A - unused_7A
7B - neg-int vA, vB
A: 목적지 레지스터 (4비트), B: 소스 레지스터 (4비트)
-vB를 vA에 저장합니다.
neg-int v0, v1
-v1을 v0에 저장합니다.
7C - not-int vA, vB
A: 목적지 레지스터 (4비트), B: 소스 레지스터 (4비트)
~vB를 vA에 저장합니다.
not-int v0, v1
~v1을 v0에 저장합니다.
7D - neg-long vA, vB
A: 목적지 레지스터 쌍 (4비트), B: 소스 레지스터 쌍 (4비트)
-(vB, vB+1)를 vA, vA+1에 저장합니다.
neg-long v0, v2
-(v2, v3)을 v0, v1에 저장합니다.
7E - not-long vA, vB
A: 목적지 레지스터 쌍 (4비트), B: 소스 레지스터 쌍 (4비트)
~(vB, vB+1)를 vA, vA+1에 저장합니다.
not-long v0, v2
~(v2, v3)을 v0, v1에 저장합니다.
7F - neg-float vA, vB
A: 목적지 레지스터 (4비트), B: 소스 레지스터 (4비트)
-vB를 vA에 저장합니다.
neg-float v0, v1
-v1을 v0에 저장합니다.
80 - neg-double vA, vB
A: 목적지 레지스터 쌍 (4비트), B: 소스 레지스터 쌍 (4비트)
-(vB, vB+1)를 vA, vA+1에 저장합니다.
neg-double v0, v2
-(v2, v3)을 v0, v1에 저장합니다.
81 - int-to-long vA, vB
A: 목적지 레지스터 쌍 (4비트), B: 소스 레지스터 (4비트)
vB(int)를 vA, vA+1에 long형으로 저장합니다.
int-to-long v0, v2
v2(int)를 v0, v1에 long형으로 저장합니다.
82 - int-to-float vA, vB
A: 목적지 레지스터 (4비트), B: 소스 레지스터 (4비트)
vB(int)를 vA에 float형으로 저장합니다.
int-to-float v0, v1
v1(int)를 v0에 float형으로 저장합니다.
83 - int-to-double vA, vB
A: 목적지 레지스터 쌍 (4비트), B: 소스 레지스터 (4비트)
vB(int)를 vA, vA+1에 double형으로 저장합니다.
int-to-double v0, v2
v2(int)를 v0, v1에 double형으로 저장합니다.
84 - long-to-int vA, vB
A: 목적지 레지스터 (4비트), B: 소스 레지스터 쌍 (4비트)
vB, vB+1(long)을 vA에 int형으로 저장합니다.
long-to-int v0, v1
v1, v2(long)를 v0에 int형으로 저장합니다.
85 - long-to-float vA, vB
A: 목적지 레지스터 (4비트), B: 소스 레지스터 쌍 (4비트)
vB, vB+1(long)을 vA에 float형으로 저장합니다.
long-to-float v0, v1
v1, v2(long)를 v0에 float형으로 저장합니다.
86 - long-to-double vA, vB
A: 목적지 레지스터 쌍 (4비트), B: 소스 레지스터 쌍 (4비트)
vB, vB+1(long)을 vA, vA+1에 double형으로 저장합니다.
long-to-double v0, v2
v2, v3(long)를 v0, v1에 double형으로 저장합니다.
87 - float-to-int vA, vB
A: 목적지 레지스터 (4비트), B: 소스 레지스터 (4비트)
vB(float)를 vA에 int형으로 저장합니다.
float-to-int v0, v1
v1(float)를 v0에 int형으로 저장합니다.
88 - float-to-long vA, vB
A: 목적지 레지스터 쌍 (4비트), B: 소스 레지스터 (4비트)
vB(float)를 vA, vA+1에 long형으로 저장합니다.
float-to-long v0, v2
v2(float)를 v0, v1에 long형으로 저장합니다.
89 - float-to-double vA, vB
A: 목적지 레지스터 쌍 (4비트), B: 소스 레지스터 (4비트)
vB(float)를 vA, vA+1에 double형으로 저장합니다.
float-to-double v0, v2
v2(float)를 v0, v1에 double형으로 저장합니다.
8A - double-to-int vA, vB
A: 목적지 레지스터 (4비트), B: 소스 레지스터 쌍 (4비트)
vB, vB+1(double)을 vA에 int형으로 저장합니다.
double-to-int v0, v1
v1, v2(double)를 v0에 int형으로 저장합니다.
8B - double-to-long vA, vB
A: 목적지 레지스터 쌍 (4비트), B: 소스 레지스터 쌍 (4비트)
vB, vB+1(double)을 vA, vA+1에 long형으로 저장합니다.
double-to-long v0, v2
v2, v3(double)을 v0, v1에 long형으로 저장합니다.
8C - double-to-float vA, vB
A: 목적지 레지스터 (4비트), B: 소스 레지스터 쌍 (4비트)
vB, vB+1(double)을 vA에 float형으로 저장합니다.
double-to-float v0, v1
v1, v2(double)를 v0에 float형으로 저장합니다.
8D - int-to-byte vA, vB
A: 목적지 레지스터 (4비트), B: 소스 레지스터 (4비트)
vB(int)를 vA에 byte형으로 저장합니다.
int-to-byte v0, v1
v1(int)를 v0에 byte형으로 저장합니다.
8E - int-to-char vA, vB
A: 목적지 레지스터 (4비트), B: 소스 레지스터 (4비트)
vB(int)를 vA에 char형으로 저장합니다.
int-to-char v0, v1
v1(int)를 v0에 char형으로 저장합니다.
8F - int-to-short vA, vB
A: 목적지 레지스터 (4비트), B: 소스 레지스터 (4비트)
vB(int)를 vA에 short형으로 저장합니다.
int-to-short v0, v1
v1(int)를 v0에 short형으로 저장합니다.
90 - add-int vA, vB, vC
A: 목적지 레지스터 (8비트), B: 소스 레지스터 (8비트), C: 소스 레지스터 (8비트)
vB+vC의 결과(int)를 vA에 넣습니다.
add-int v0, v1, v2
v1+v2의 결과(int)를 v0에 넣습니다.
91 - sub-int vA, vB, vC
A: 목적지 레지스터 (8비트), B: 소스 레지스터 (8비트), C: 소스 레지스터 (8비트)
vB-vC의 결과(int)를 vA에 넣습니다.
sub-int v0, v1, v2
v1-v2의 결과(int)를 v0에 넣습니다.
92 - mul-int vA, vB, vC
A: 목적지 레지스터 (8비트), B: 소스 레지스터 (8비트), C: 소스 레지스터 (8비트)
vB*vC의 결과(int)를 vA에 넣습니다.
mul-int v0, v1, v2
v1*v2의 결과(int)를 v0에 넣습니다.
93 - div-int vA, vB, vC
A: 목적지 레지스터 (8비트), B: 소스 레지스터 (8비트), C: 소스 레지스터 (8비트)
vB/vC의 결과(int)를 vA에 넣습니다.
div-int v0, v1, v2
v1/v2의 결과(int)를 v0에 넣습니다.
94 - rem-int vA, vB, vC
A: 목적지 레지스터 (8비트), B: 소스 레지스터 (8비트), C: 소스 레지스터 (8비트)
vB%vC의 결과(int)를 vA에 넣습니다. 나머지
rem-int v0, v1, v2
v1%v2의 결과(int)를 v0에 넣습니다.
95 - and-int vA, vB, vC
A: 목적지 레지스터 (8비트), B: 소스 레지스터 (8비트), C: 소스 레지스터 (8비트)
vB&vC의 결과(int)를 vA에 넣습니다. AND
and-int v0, v1, v2
v1&v2의 결과(int)를 v0에 넣습니다.
96 - or-int vA, vB, vC
A: 목적지 레지스터 (8비트), B: 소스 레지스터 (8비트), C: 소스 레지스터 (8비트)
vB|vC의 결과(int)를 vA에 넣습니다. OR
or-int v0, v1, v2
v1|v2의 결과(int)를 v0에 넣습니다.
97 - xor-int vA, vB, vC
A: 목적지 레지스터 (8비트), B: 소스 레지스터 (8비트), C: 소스 레지스터 (8비트)
vB^vC의 결과(int)를 vA에 넣습니다. XOR
xor-int v0, v1, v2
v1^v2의 결과(int)를 v0에 넣습니다.
98 - shl-int vA, vB, vC
A: 목적지 레지스터 (8비트), B: 소스 레지스터 (8비트), C: 소스 레지스터 (8비트)
vB<<vC의 결과(int)를 vA에 넣습니다. Shift Left
shl-int v0, v1, v2
v1<<v2의 결과(int)를 v0에 넣습니다.
99 - shr-int vA, vB, vC
A: 목적지 레지스터 (8비트), B: 소스 레지스터 (8비트), C: 소스 레지스터 (8비트)
vB>>vC의 결과(int)를 vA에 넣습니다. Shift Right
shr-int v0, v1, v2
v1>>v2의 결과(int)를 v0에 넣습니다.
9A - ushr-int vA, vB, vC
A: 목적지 레지스터 (8비트), B: 소스 레지스터 (8비트), C: 소스 레지스터 (8비트)
vB>>>vC의 결과(int)를 vA에 넣습니다. Unsigned Shift Right
shr-int v0, v1, v2
v1>>>v2의 결과(int)를 v0에 넣습니다.
9B - add-long vA, vB, vC
A: 목적지 레지스터 쌍 (8비트), B: 소스 레지스터 쌍 (8비트), C: 소스 레지스터 쌍 (8비트)
(vB, vB+1)+(vC, vC+1)의 결과(long)를 vA, vA+1에 넣습니다.
add-long v0, v2, v4
(v2, v3)+(v4, v5)의 결과(long)를 v0, v1에 넣습니다.
9C - sub-long vA, vB, vC
A: 목적지 레지스터 쌍 (8비트), B: 소스 레지스터 쌍 (8비트), C: 소스 레지스터 쌍 (8비트)
(vB, vB+1)-(vC, vC+1)의 결과(long)를 vA, vA+1에 넣습니다.
sub-long v0, v2, v4
(v2, v3)-(v4, v5)의 결과(long)를 v0, v1에 넣습니다.
9D - mul-long vA, vB, vC
A: 목적지 레지스터 쌍 (8비트), B: 소스 레지스터 쌍 (8비트), C: 소스 레지스터 쌍 (8비트)
(vB, vB+1)*(vC, vC+1)의 결과(long)를 vA, vA+1에 넣습니다.
mul-long v0, v2, v4
(v2, v3)*(v4, v5)의 결과(long)를 v0, v1에 넣습니다.
9E - div-long vA, vB, vC
A: 목적지 레지스터 쌍 (8비트), B: 소스 레지스터 쌍 (8비트), C: 소스 레지스터 쌍 (8비트)
(vB, vB+1)/(vC, vC+1)의 결과(long)를 vA, vA+1에 넣습니다.
div-long v0, v2, v4
(v2, v3)/(v4, v5)의 결과(long)를 v0, v1에 넣습니다.
9F - rem-long vA, vB, vC
A: 목적지 레지스터 쌍 (8비트), B: 소스 레지스터 쌍 (8비트), C: 소스 레지스터 쌍 (8비트)
(vB, vB+1)%(vC, vC+1)의 결과(long)를 vA, vA+1에 넣습니다.
rem-long v0, v2, v4
(v2, v3)%(v4, v5)의 결과(long)를 v0, v1에 넣습니다.
A0 - and-long vA, vB, vC
A: 목적지 레지스터 쌍 (8비트), B: 소스 레지스터 쌍 (8비트), C: 소스 레지스터 쌍 (8비트)
(vB, vB+1)&(vC, vC+1)의 결과(long)를 vA, vA+1에 넣습니다.
and-long v0, v2, v4
(v2, v3)&(v4, v5)의 결과(long)를 v0, v1에 넣습니다.
A1 - or-long vA, vB, vC
A: 목적지 레지스터 쌍 (8비트), B: 소스 레지스터 쌍 (8비트), C: 소스 레지스터 쌍 (8비트)
(vB, vB+1)|(vC, vC+1)의 결과(long)를 vA, vA+1에 넣습니다.
or-long v0, v2, v4
(v2, v3)|(v4, v5)의 결과(long)를 v0, v1에 넣습니다.
A2 - xor-long vA, vB, vC
A: 목적지 레지스터 쌍 (8비트), B: 소스 레지스터 쌍 (8비트), C: 소스 레지스터 쌍 (8비트)
(vB, vB+1)^(vC, vC+1)의 결과(long)를 vA, vA+1에 넣습니다.
xor-long v0, v2, v4
(v2, v3)^(v4, v5)의 결과(long)를 v0, v1에 넣습니다.
A3 - shl-long vA, vB, vC
A: 목적지 레지스터 쌍 (8비트), B: 소스 레지스터 쌍 (8비트), C: 소스 레지스터 (8비트)
(vB, vB+1)<<vC의 결과(long)를 vA, vA+1에 넣습니다.
shl-long v0, v2, v4
(v2, v3)<<v4의 결과(long)를 v0, v1에 넣습니다.
A4 - shr-long vA, vB, vC
A: 목적지 레지스터 쌍 (8비트), B: 소스 레지스터 쌍 (8비트), C: 소스 레지스터 (8비트)
(vB, vB+1)>>vC의 결과(long)를 vA, vA+1에 넣습니다.
shr-long v0, v2, v4
(v2, v3)>>v4의 결과(long)를 v0, v1에 넣습니다.
A5 - ushr-long vA, vB, vC
A: 목적지 레지스터 쌍 (8비트), B: 소스 레지스터 쌍 (8비트), C: 소스 레지스터 (8비트)
(vB, vB+1)>>>vC의 결과(long)를 vA, vA+1에 넣습니다.
ushr-long v0, v2, v4
(v2, v3)>>>v4의 결과(long)를 v0, v1에 넣습니다.
A6 - add-float vA, vB, vC
A: 목적지 레지스터 (8비트), B: 소스 레지스터 (8비트), C: 소스 레지스터 (8비트)
vB+vC의 결과(float)를 vA에 넣습니다.
add-float v0, v1, v2
v1+v2의 결과(float)를 v0에 넣습니다.
A7 - sub-float vA, vB, vC
A: 목적지 레지스터 (8비트), B: 소스 레지스터 (8비트), C: 소스 레지스터 (8비트)
vB-vC의 결과(float)를 vA에 넣습니다.
sub-float v0, v1, v2
v1-v2의 결과(float)를 v0에 넣습니다.
A8 - mul-float vA, vB, vC
A: 목적지 레지스터 (8비트), B: 소스 레지스터 (8비트), C: 소스 레지스터 (8비트)
vB*vC의 결과(float)를 vA에 넣습니다.
mul-float v0, v1, v2
v1*v2의 결과(float)를 v0에 넣습니다.
A9 - div-float vA, vB, vC
A: 목적지 레지스터 (8비트), B: 소스 레지스터 (8비트), C: 소스 레지스터 (8비트)
vB/vC의 결과(float)를 vA에 넣습니다.
div-float v0, v1, v2
v1/v2의 결과(float)를 v0에 넣습니다.
AA - rem-float vA, vB, vC
A: 목적지 레지스터 (8비트), B: 소스 레지스터 (8비트), C: 소스 레지스터 (8비트)
vB%vC의 결과(float)를 vA에 넣습니다.
rem-float v0, v1, v2
v1%v2의 결과(float)를 v0에 넣습니다.
AB - add-double vA, vB, vC
A: 목적지 레지스터 쌍 (8비트), B: 소스 레지스터 쌍 (8비트), C: 소스 레지스터 쌍 (8비트)
(vB, vB+1)+(vC, vC+1)의 결과(double)를 vA, vA+1에 넣습니다.
add-double v0, v2, v4
(v2, v3)+(v4, v5)의 결과(double)를 v0, v1에 넣습니다.
AC - sub-double vA, vB, vC
A: 목적지 레지스터 쌍 (8비트), B: 소스 레지스터 쌍 (8비트), C: 소스 레지스터 쌍 (8비트)
(vB, vB+1)-(vC, vC+1)의 결과(double)를 vA, vA+1에 넣습니다.
sub-double v0, v2, v4
(v2, v3)-(v4, v5)의 결과(double)를 v0, v1에 넣습니다.
AD - mul-double vA, vB, vC
A: 목적지 레지스터 쌍 (8비트), B: 소스 레지스터 쌍 (8비트), C: 소스 레지스터 쌍 (8비트)
(vB, vB+1)*(vC, vC+1)의 결과(double)를 vA, vA+1에 넣습니다.
mul-double v0, v2, v4
(v2, v3)*(v4, v5)의 결과(double)를 v0, v1에 넣습니다.
AE - div-double vA, vB, vC
A: 목적지 레지스터 쌍 (8비트), B: 소스 레지스터 쌍 (8비트), C: 소스 레지스터 쌍 (8비트)
(vB, vB+1)/(vC, vC+1)의 결과(double)를 vA, vA+1에 넣습니다.
div-double v0, v2, v4
(v2, v3)/(v4, v5)의 결과(double)를 v0, v1에 넣습니다.
AF - rem-double vA, vB, vC
A: 목적지 레지스터 쌍 (8비트), B: 소스 레지스터 쌍 (8비트), C: 소스 레지스터 쌍 (8비트)
(vB, vB+1)%(vC, vC+1)의 결과(double)를 vA, vA+1에 넣습니다.
rem-double v0, v2, v4
(v2, v3)%(v4, v5)의 결과(double)를 v0, v1에 넣습니다.
B0 - add-int/2addr vA, vB
A: 목적지+소스 레지스터 (4비트), B: 소스 레지스터 (4비트)
vA+vB의 결과(int)를 vA에 넣습니다.
add-int/2addr v0, v1
v0+v1의 결과(int)를 v0에 넣습니다.
B1 - sub-int/2addr vA, vB
A: 목적지+소스 레지스터 (4비트), B: 소스 레지스터 (4비트)
vA-vB의 결과(int)를 vA에 넣습니다.
sub-int/2addr v0, v1
v0-v1의 결과(int)를 v0에 넣습니다.
B2 - mul-int/2addr vA, vB
A: 목적지+소스 레지스터 (4비트), B: 소스 레지스터 (4비트)
vA*vB의 결과(int)를 vA에 넣습니다.
mul-int/2addr v0, v1
v0*v1의 결과(int)를 v0에 넣습니다.
B3 - div-int/2addr vA, vB
A: 목적지+소스 레지스터 (4비트), B: 소스 레지스터 (4비트)
vA/vB의 결과(int)를 vA에 넣습니다.
div-int/2addr v0, v1
v0/v1의 결과(int)를 v0에 넣습니다.
B4 - rem-int/2addr vA, vB
A: 목적지+소스 레지스터 (4비트), B: 소스 레지스터 (4비트)
vA%vB의 결과(int)를 vA에 넣습니다.
rem-int/2addr v0, v1
v0%v1의 결과(int)를 v0에 넣습니다.
B5 - and-int/2addr vA, vB
A: 목적지+소스 레지스터 (4비트), B: 소스 레지스터 (4비트)
vA&vB의 결과(int)를 vA에 넣습니다.
and-int/2addr v0, v1
v0&v1의 결과(int)를 v0에 넣습니다.
B6 - or-int/2addr vA, vB
A: 목적지+소스 레지스터 (4비트), B: 소스 레지스터 (4비트)
vA|vB의 결과(int)를 vA에 넣습니다.
or-int/2addr v0, v1
v0|v1의 결과(int)를 v0에 넣습니다.
B7 - xor-int/2addr vA, vB
A: 목적지+소스 레지스터 (4비트), B: 소스 레지스터 (4비트)
vA^vB의 결과(int)를 vA에 넣습니다.
xor-int/2addr v0, v1
v0^v1의 결과(int)를 v0에 넣습니다.
B8 - shl-int/2addr vA, vB
A: 목적지+소스 레지스터 (4비트), B: 소스 레지스터 (4비트)
vA<<vB의 결과(int)를 vA에 넣습니다.
shl-int/2addr v0, v1
v0<<v1의 결과(int)를 v0에 넣습니다.
B9 - shr-int/2addr vA, vB
A: 목적지+소스 레지스터 (4비트), B: 소스 레지스터 (4비트)
vA>>vB의 결과(int)를 vA에 넣습니다.
shr-int/2addr v0, v1
v0>>v1의 결과(int)를 v0에 넣습니다.
BA - ushr-int/2addr vA, vB
A: 목적지+소스 레지스터 (4비트), B: 소스 레지스터 (4비트)
vA>>>vB의 결과(int)를 vA에 넣습니다.
ushr-int/2addr v0, v1
v0>>>v1의 결과(int)를 v0에 넣습니다.
BB - add-long/2addr vA, vB
A: 목적지+소스 레지스터 쌍 (4비트), B: 소스 레지스터 쌍 (4비트)
(vA, vA+1)+(vB, vB+1)의 결과(long)를 vA, vA+1에 넣습니다.
add-long/2addr v0, v2
(v0, v1)+(v2, v3)의 결과(long)를 v0, v1에 넣습니다.
BC - sub-long/2addr vA, vB
A: 목적지+소스 레지스터 쌍 (4비트), B: 소스 레지스터 쌍 (4비트)
(vA, vA+1)-(vB, vB+1)의 결과(long)를 vA, vA+1에 넣습니다.
sub-long/2addr v0, v2
(v0, v1)-(v2, v3)의 결과(long)를 v0, v1에 넣습니다.
BD - mul-long/2addr vA, vB
A: 목적지+소스 레지스터 쌍 (4비트), B: 소스 레지스터 쌍 (4비트)
(vA, vA+1)*(vB, vB+1)의 결과(long)를 vA, vA+1에 넣습니다.
mul-long/2addr v0, v2
(v0, v1)*(v2, v3)의 결과(long)를 v0, v1에 넣습니다.
BE - div-long/2addr vA, vB
A: 목적지+소스 레지스터 쌍 (4비트), B: 소스 레지스터 쌍 (4비트)
(vA, vA+1)/(vB, vB+1)의 결과(long)를 vA, vA+1에 넣습니다.
div-long/2addr v0, v2
(v0, v1)/(v2, v3)의 결과(long)를 v0, v1에 넣습니다.
BF - rem-long/2addr vA, vB
A: 목적지+소스 레지스터 쌍 (4비트), B: 소스 레지스터 쌍 (4비트)
(vA, vA+1)%(vB, vB+1)의 결과(long)를 vA, vA+1에 넣습니다.
rem-long/2addr v0, v2
(v0, v1)%(v2, v3)의 결과(long)를 v0, v1에 넣습니다.
C0 - and-long/2addr vA, vB
A: 목적지+소스 레지스터 쌍 (4비트), B: 소스 레지스터 쌍 (4비트)
(vA, vA+1)&(vB, vB+1)의 결과(long)를 vA, vA+1에 넣습니다.
and-long/2addr v0, v2
(v0, v1)&(v2, v3)의 결과(long)를 v0, v1에 넣습니다.
C1 - or-long/2addr vA, vB
A: 목적지+소스 레지스터 쌍 (4비트), B: 소스 레지스터 쌍 (4비트)
(vA, vA+1)|(vB, vB+1)의 결과(long)를 vA, vA+1에 넣습니다.
or-long/2addr v0, v2
(v0, v1)|(v2, v3)의 결과(long)를 v0, v1에 넣습니다.
C2 - xor-long/2addr vA, vB
A: 목적지+소스 레지스터 쌍 (4비트), B: 소스 레지스터 쌍 (4비트)
(vA, vA+1)^(vB, vB+1)의 결과(long)를 vA, vA+1에 넣습니다.
xor-long/2addr v0, v2
(v0, v1)^(v2, v3)의 결과(long)를 v0, v1에 넣습니다.
C3 - shl-long/2addr vA, vB
A: 목적지+소스 레지스터 쌍 (4비트), B: 소스 레지스터 (4비트)
(vA, vA+1)<<vB의 결과(long)를 vA, vA+1에 넣습니다.
shl-long/2addr v0, v2
(v0, v1)<<v2의 결과(long)를 v0, v1에 넣습니다.
C4 - shr-long/2addr vA, vB
A: 목적지+소스 레지스터 쌍 (4비트), B: 소스 레지스터 (4비트)
(vA, vA+1)>>vB의 결과(long)를 vA, vA+1에 넣습니다.
shr-long/2addr v0, v2
(v0, v1)>>v2의 결과(long)를 v0, v1에 넣습니다.
C5 - ushr-long/2addr vA, vB
A: 목적지+소스 레지스터 쌍 (4비트), B: 소스 레지스터 (4비트)
(vA, vA+1)>>>vB의 결과(long)를 vA, vA+1에 넣습니다.
ushr-long/2addr v0, v2
(v0, v1)>>>v2의 결과(long)를 v0, v1에 넣습니다.
C6 - add-float/2addr vA,vB
A: 목적지+소스 레지스터 (4비트), B: 소스 레지스터 (4비트)
vA+vB의 결과(float)를 vA에 넣습니다.
add-float/2addr v0, v1
v0+v1의 결과(float)를 v0에 넣습니다.
C7 - sub-float/2addr vA, vB
A: 목적지+소스 레지스터 (4비트), B: 소스 레지스터 (4비트)
vA-vB의 결과(float)를 vA에 넣습니다.
sub-float/2addr v0, v1
v0-v1의 결과(float)를 v0에 넣습니다.
C8 - mul-float/2addr vA, vB
A: 목적지+소스 레지스터 (4비트), B: 소스 레지스터 (4비트)
vA*vB의 결과(float)를 vA에 넣습니다.
mul-float/2addr v0, v1
v0*v1의 결과(float)를 v0에 넣습니다.
C9 - div-float/2addr vA, vB
A: 목적지+소스 레지스터 (4비트), B: 소스 레지스터 (4비트)
vA/vB의 결과(float)를 vA에 넣습니다.
div-float/2addr v0, v1
v0/v1의 결과(float)를 v0에 넣습니다.
CA - rem-float/2addr vA, vB
A: 목적지+소스 레지스터 (4비트), B: 소스 레지스터 (4비트)
vA%vB의 결과(float)를 vA에 넣습니다.
rem-float/2addr v0, v1
v0%v1의 결과(float)를 v0에 넣습니다.
CB - add-double/2addr vA, vB
A: 목적지+소스 레지스터 쌍 (4비트), B: 소스 레지스터 쌍 (4비트)
(vA, vA+1)+(vB, vB+1)의 결과(double)를 vA, vA+1에 넣습니다.
add-double/2addr v0, v2
(v0, v1)+(v2, v3)의 결과(double)를 v0, v1에 넣습니다.
CC - sub-double/2addr vA, vB
A: 목적지+소스 레지스터 쌍 (4비트), B: 소스 레지스터 쌍 (4비트)
(vA, vA+1)-(vB, vB+1)의 결과(double)를 vA, vA+1에 넣습니다.
sub-double/2addr v0, v2
(v0, v1)-(v2, v3)의 결과(double)를 v0, v1에 넣습니다.
CD - mul-double/2addr vA, vB
A: 목적지+소스 레지스터 쌍 (4비트), B: 소스 레지스터 쌍 (4비트)
(vA, vA+1)*(vB, vB+1)의 결과(double)를 vA, vA+1에 넣습니다.
mul-double/2addr v0, v2
(v0, v1)*(v2, v3)의 결과(double)를 v0, v1에 넣습니다.
CE - div-double/2addr vA, vB
A: 목적지+소스 레지스터 쌍 (4비트), B: 소스 레지스터 쌍 (4비트)
(vA, vA+1)/(vB, vB+1)의 결과(double)를 vA, vA+1에 넣습니다.
div-double/2addr v0, v2
(v0, v1)/(v2, v3)의 결과(double)를 v0, v1에 넣습니다.
CF - rem-double/2addr vA, vB
A: 목적지+소스 레지스터 쌍 (4비트), B: 소스 레지스터 쌍 (4비트)
(vA, vA+1)%(vB, vB+1)의 결과(double)를 vA, vA+1에 넣습니다.
rem-double/2addr v0, v2
(v0, v1)%(v2, v3)의 결과(double)를 v0, v1에 넣습니다.
D0 - add-int/lit16 vA, vB, C
A: 목적지 레지스터 (4비트), B: 소스 레지스터 (4비트), C: signed int (16비트)
vB+리터럴 C의 결과(int)를 vA에 넣습니다. C의 범위는 -0x8000에서 0x7fff까지입니다.
add-int/lit16 v0, v1, 0x1
v1+1의 결과(int)를 v0에 넣습니다.
D1 - sub-int/lit16 vA, vB, C
A: 목적지 레지스터 (4비트), B: 소스 레지스터 (4비트), C: signed int (16비트)
vB-리터럴 C의 결과(int)를 vA에 넣습니다. C의 범위는 -0x8000에서 0x7fff까지입니다.
sub-int/lit16 v0, v1, 0x2
v1-2의 결과(int)를 v0에 넣습니다.
D2 - mul-int/lit16 vA, vB, lit16
A: 목적지 레지스터 (4비트), B: 소스 레지스터 (4비트), C: signed int (16비트)
vB*리터럴 C의 결과(int)를 vA에 넣습니다. C의 범위는 -0x8000에서 0x7fff까지입니다.
mul-int/lit16 v0, v1, 0x3
v1*3의 결과(int)를 v0에 넣습니다.
D3 - div-int/lit16 vA, vB, C
A: 목적지 레지스터 (4비트), B: 소스 레지스터 (4비트), C: signed int (16비트)
vB/리터럴 C의 결과(int)를 vA에 넣습니다. C의 범위는 -0x8000에서 0x7fff까지입니다.
div-int/lit16 v0, v1, 0x4
v1/4의 결과(int)를 v0에 넣습니다.
D4 - rem-int/lit16 vA, vB, C
A: 목적지 레지스터 (4비트), B: 소스 레지스터 (4비트), C: signed int (16비트)
vB%리터럴 C의 결과(int)를 vA에 넣습니다. C의 범위는 -0x8000에서 0x7fff까지입니다.
rem-int/lit16 v0, v1, 0x5
v1%5의 결과(int)를 v0에 넣습니다.
D5 - and-int/lit16 vA, vB, C
A: 목적지 레지스터 (4비트), B: 소스 레지스터 (4비트), C: signed int (16비트)
vB&리터럴 C의 결과(int)를 vA에 넣습니다. C의 범위는 -0x8000에서 0x7fff까지입니다.
and-int/lit16 v0, v1, 0x6
v1&6의 결과(int)를 v0에 넣습니다.
D6 - or-int/lit16 vA, vB, C
A: 목적지 레지스터 (4비트), B: 소스 레지스터 (4비트), C: signed int (16비트)
vB|리터럴 C의 결과(int)를 vA에 넣습니다. C의 범위는 -0x8000에서 0x7fff까지입니다.
or-int/lit16 v0, v1, 0x7
v1|7의 결과(int)를 v0에 넣습니다.
D7 - xor-int/lit16 vA, vB, C
A: 목적지 레지스터 (4비트), B: 소스 레지스터 (4비트), C: signed int (16비트)
vB^리터럴 C의 결과(int)를 vA에 넣습니다. C의 범위는 -0x8000에서 0x7fff까지입니다.
xor-int/lit16 v0, v1, 0x8
v1^8의 결과(int)를 v0에 넣습니다.
D8 - add-int/lit8 vA, vB, lit8
A: 목적지 레지스터 (8비트), B: 소스 레지스터 (8비트), C: signed int (8비트)
vB+리터럴 C의 결과(int)를 vA에 넣습니다. C의 범위는 -0x80에서 0x7f까지입니다.
add-int/lit8 v0, v1, 0x1
v1+1의 결과(int)를 v0에 넣습니다.
D9 - sub-int/lit8 vA, vB, C
A: 목적지 레지스터 (8비트), B: 소스 레지스터 (8비트), C: signed int (8비트)
vB-리터럴 C의 결과(int)를 vA에 넣습니다. C의 범위는 -0x80에서 0x7f까지입니다.
sub-int/lit8 v0, v1, 0x2
v1-2의 결과(int)를 v0에 넣습니다.
DA - mul-int/lit8 vA, vB, C
A: 목적지 레지스터 (8비트), B: 소스 레지스터 (8비트), C: signed int (8비트)
vB*리터럴 C의 결과(int)를 vA에 넣습니다. C의 범위는 -0x80에서 0x7f까지입니다.
mul-int/lit8 v0, v1, 0x3
v1*3의 결과(int)를 v0에 넣습니다.
DB - div-int/lit8 vA, vB, C
A: 목적지 레지스터 (8비트), B: 소스 레지스터 (8비트), C: signed int (8비트)
vB/리터럴 C의 결과(int)를 vA에 넣습니다. C의 범위는 -0x80에서 0x7f까지입니다.
div-int/lit8 v0, v1, 0x4
v1/4의 결과(int)를 v0에 넣습니다.
DC - rem-int/lit8 vA, vB, C
A: 목적지 레지스터 (8비트), B: 소스 레지스터 (8비트), C: signed int (8비트)
vB%리터럴 C의 결과(int)를 vA에 넣습니다. C의 범위는 -0x80에서 0x7f까지입니다.
rem-int/lit8 v0, v1, 0x5
v1%5의 결과(int)를 v0에 넣습니다.
DD - and-int/lit8 vA, vB, C
A: 목적지 레지스터 (8비트), B: 소스 레지스터 (8비트), C: signed int (8비트)
vB&리터럴 C의 결과(int)를 vA에 넣습니다. C의 범위는 -0x80에서 0x7f까지입니다.
and-int/lit8 v0, v1, 0x5
v1&5의 결과(int)를 v0에 넣습니다.
DE - or-int/lit8 vA, vB, C
A: 목적지 레지스터 (8비트), B: 소스 레지스터 (8비트), C: signed int (8비트)
vB|리터럴 C의 결과(int)를 vA에 넣습니다. C의 범위는 -0x80에서 0x7f까지입니다.
or-int/lit8 v0, v1, 0x6
v1|6의 결과(int)를 v0에 넣습니다.
DF - xor-int/lit8 vA, vB, C
A: 목적지 레지스터 (8비트), B: 소스 레지스터 (8비트), C: signed int (8비트)
vB^리터럴 C의 결과(int)를 vA에 넣습니다. C의 범위는 -0x80에서 0x7f까지입니다.
xor-int/lit8 v0, v1, 0x7
v1^7의 결과(int)를 v0에 넣습니다.
E0 - shl-int/lit8 vA, vB, C
A: 목적지 레지스터 (8비트), B: 소스 레지스터 (8비트), C: signed int (8비트)
vB<<리터럴 C의 결과(int)를 vA에 넣습니다. C의 범위는 -0x80에서 0x7f까지입니다.
shl-int/lit8 v0, v1, 0x8
v1<<8의 결과(int)를 v0에 넣습니다.
E1 - shr-int/lit8 vA, vB, C
A: 목적지 레지스터 (8비트), B: 소스 레지스터 (8비트), C: signed int (8비트)
vB>>리터럴 C의 결과(int)를 vA에 넣습니다. C의 범위는 -0x80에서 0x7f까지입니다.
shr-int/lit8 v0, v1, 0x9
v1>>9의 결과(int)를 v0에 넣습니다.
E2 - ushr-int/lit8 vA, vB, C
A: 목적지 레지스터 (8비트), B: 소스 레지스터 (8비트), C: signed int (8비트)
vB>>>리터럴 C의 결과(int)를 vA에 넣습니다. C의 범위는 -0x80에서 0x7f까지입니다.
ushr-int/lit8 v0, v1, 0xA
v1>>>A의 결과(int)를 v0에 넣습니다.
E3 - unused_E3
E4 - unused_E4
E5 - unused_E5
E6 - unused_E6
E7 - unused_E7
E8 - unused_E8
E9 - unused_E9
EA - unused_EA
EB - unused_EB
EC - unused_EC
ED - unused_ED
EE - execute-inline , inline ID
Executes the inline method identified by inline ID6.
EE20 0300 0100 - execute-inline , inline #0003
Executes inline method #3 using v1 as "this" and passing one parameter in v0.
EF - unused_EF
F0 - invoke-direct-empty
Stands as a placeholder for pruned empty methods like Object.<init>. This acts as nop during normal execution6.
F010 F608 0000 - invoke-direct-empty , Ljava/lang/Object;.<init>:()V // method@08f6
Replacement for the empty method java/lang/Object;<init>.
F1 - unused_F1
F2 - iget-quick vA, vB, offset
Gets the value stored at offset in vB instance's data area to vA6. F221 1000 - iget-quick v1, v2, [obj+0010]
Gets the value at offset 0CH of the instance pointed by v2 and stores the object reference in v1.
F3 - iget-wide-quick vA, vB, offset
Gets the object reference value stored at offset in vB instance's data area to vA,vA+16. F364 3001 - iget-wide-quick v4, v6, [obj+0130]
Gets the value at offset 130H of the instance pointed by v6 and stores the object reference in v4,v5.
F4 - iget-object-quick vA, vB, offset
Gets the object reference value stored at offset in vB instance's data area to vA6.
F431 0C00 - iget-object-quick v1, v3, [obj+000c]
Gets the object reference value at offset 0CH of the instance pointed by v3 and stores the object reference in v1.
F5 - iput-quick vA, vB, offset
Puts the value stored in vA to offset in vB instance's data area6. F521 1000 - iput-quick v1, v2, [obj+0010]
Puts the object reference value in v1 to offset 10H of the instance pointed by v2.
F6 - iput-wide-quick vA, vB, offset
Puts the value stored in vA,vA+1 to offset in vB instance's data area6. F652 7001 - iput-wide-quick v2, v5, [obj+0170]
Puts the value in v2,v3 to offset 170H of the instance pointed by v5.
F7 - iput-object-quick vA, vB, offset
Puts the object reference value stored in vA to offset in vB instance's data area to vA6. F701 4C00 - iput-object-quick v1, v0, [obj+004c]
Puts the object reference value in v1 to offset 0CH of the instance pointed by v3.
F8 - invoke-virtual-quick , vtable offset
Invokes a virtual method using the vtable of the target object6.
F820 B800 CF00 - invoke-virtual-quick , vtable #00b8
Invokes a virtual method. The target object instance is pointed by v15 and vtable entry #B8 points to the method to be called. v12 is a parameter to the method call.
F9 - invoke-virtual-quick/range , vtable offset
Invokes a virtual method using the vtable of the target object6 F906 1800 0000 - invoke-virtual-quick/range ,vtable #0018
Invokes a method using the vtable of the instance pointed by v0. v1..v5 registers are parameters to the method call.
FA - invoke-super-quick , vtable offset
Invokes a virtual method in the target object's immediate parent class using the vtable of that parent class6. FA40 8100 3254 - invoke-super-quick , vtable #0081
Invokes a method using the vtable of the immediate parent class of instance pointed by v2. v3, v4 and v5 registers are parameters to the method call.
FB - invoke-super-quick/range , vtable offset
Invokes a virtual method in the target object's immediate parent class using the vtable of that parent class6.
F906 1B00 0000 - invoke-super-quick/range , vtable #001b
Invokes a method using the vtable of the immediate parent class of instance pointed by v0. v1..v5 registers are parameters to the method call.
FC - unused_FC
FD - unused_FD
FE - unused_FE
FF - unused_FF
* reference
http://modapk.tistory.com/13
https://source.android.com/devices/tech/dalvik/dalvik-bytecode.html
'Programming > Android' 카테고리의 다른 글
안드로이드 스튜디오 메모리 할당 높이기 (0) | 2017.08.09 |
---|---|
빌드내역 프로파일링 (0) | 2017.08.09 |
안드로이드 그레이들 속도 개선 패치 (0) | 2017.08.09 |
libgdx 빌드 및 설정 관리 기록 (0) | 2017.08.09 |
레이아웃 디자인탭 한글패치 (0) | 2017.08.09 |