629 lines
8.9 KiB
Smali
629 lines
8.9 KiB
Smali
# Tests most/all DEX behaviors as of version 37.
|
|
# Disassembled from dexdump test files.
|
|
# Repo: https://android.googlesource.com/platform/art/
|
|
# File: test/dexdump/all.dex
|
|
|
|
# Compile using smali: https://github.com/JesusFreke/smali
|
|
# java -jar smali.jar assemble all.smali --api 25
|
|
|
|
.class public LA;
|
|
.super Ljava/lang/Object;
|
|
|
|
|
|
# static fields
|
|
.field private static sB:B
|
|
|
|
.field private static sC:C
|
|
|
|
.field private static sI:I
|
|
|
|
.field private static sJ:J
|
|
|
|
.field private static sO:LA;
|
|
|
|
.field private static sS:S
|
|
|
|
.field private static sZ:Z
|
|
|
|
|
|
# instance fields
|
|
.field private mB:B
|
|
|
|
.field private mC:C
|
|
|
|
.field private mI:I
|
|
|
|
.field private mJ:J
|
|
|
|
.field private mO:LA;
|
|
|
|
.field private mS:S
|
|
|
|
.field private mZ:Z
|
|
|
|
|
|
# direct methods
|
|
.method public constructor <init>()V
|
|
.registers 1
|
|
|
|
invoke-direct {p0}, Ljava/lang/Object;-><init>()V
|
|
|
|
return-void
|
|
.end method
|
|
|
|
.method public static arrays()V
|
|
.registers 3
|
|
|
|
aget v0, v1, v2
|
|
|
|
aget-wide v0, v1, v2
|
|
|
|
aget-object v0, v1, v2
|
|
|
|
aget-boolean v0, v1, v2
|
|
|
|
aget-byte v0, v1, v2
|
|
|
|
aget-char v0, v1, v2
|
|
|
|
aget-short v0, v1, v2
|
|
|
|
aput v0, v1, v2
|
|
|
|
aput-wide v0, v1, v2
|
|
|
|
aput-object v0, v1, v2
|
|
|
|
aput-boolean v0, v1, v2
|
|
|
|
aput-byte v0, v1, v2
|
|
|
|
aput-char v0, v1, v2
|
|
|
|
aput-short v0, v1, v2
|
|
|
|
return-void
|
|
.end method
|
|
|
|
.method public static binary_ops()V
|
|
.registers 3
|
|
|
|
add-int v0, v1, v2
|
|
|
|
sub-int v0, v1, v2
|
|
|
|
mul-int v0, v1, v2
|
|
|
|
div-int v0, v1, v2
|
|
|
|
rem-int v0, v1, v2
|
|
|
|
and-int v0, v1, v2
|
|
|
|
or-int v0, v1, v2
|
|
|
|
xor-int v0, v1, v2
|
|
|
|
shl-int v0, v1, v2
|
|
|
|
shr-int v0, v1, v2
|
|
|
|
ushr-int v0, v1, v2
|
|
|
|
add-long v0, v1, v2
|
|
|
|
sub-long v0, v1, v2
|
|
|
|
mul-long v0, v1, v2
|
|
|
|
div-long v0, v1, v2
|
|
|
|
rem-long v0, v1, v2
|
|
|
|
and-long v0, v1, v2
|
|
|
|
or-long v0, v1, v2
|
|
|
|
xor-long v0, v1, v2
|
|
|
|
shl-long v0, v1, v2
|
|
|
|
shr-long v0, v1, v2
|
|
|
|
ushr-long v0, v1, v2
|
|
|
|
add-float v0, v1, v2
|
|
|
|
sub-float v0, v1, v2
|
|
|
|
mul-float v0, v1, v2
|
|
|
|
div-float v0, v1, v2
|
|
|
|
rem-float v0, v1, v2
|
|
|
|
add-double v0, v1, v2
|
|
|
|
sub-double v0, v1, v2
|
|
|
|
mul-double v0, v1, v2
|
|
|
|
div-double v0, v1, v2
|
|
|
|
rem-double v0, v1, v2
|
|
|
|
return-void
|
|
.end method
|
|
|
|
.method public static binary_ops_2addr()V
|
|
.registers 2
|
|
|
|
add-int/2addr v0, v1
|
|
|
|
sub-int/2addr v0, v1
|
|
|
|
mul-int/2addr v0, v1
|
|
|
|
div-int/2addr v0, v1
|
|
|
|
rem-int/2addr v0, v1
|
|
|
|
and-int/2addr v0, v1
|
|
|
|
or-int/2addr v0, v1
|
|
|
|
xor-int/2addr v0, v1
|
|
|
|
shl-int/2addr v0, v1
|
|
|
|
shr-int/2addr v0, v1
|
|
|
|
ushr-int/2addr v0, v1
|
|
|
|
add-long/2addr v0, v1
|
|
|
|
sub-long/2addr v0, v1
|
|
|
|
mul-long/2addr v0, v1
|
|
|
|
div-long/2addr v0, v1
|
|
|
|
rem-long/2addr v0, v1
|
|
|
|
and-long/2addr v0, v1
|
|
|
|
or-long/2addr v0, v1
|
|
|
|
xor-long/2addr v0, v1
|
|
|
|
shl-long/2addr v0, v1
|
|
|
|
shr-long/2addr v0, v1
|
|
|
|
ushr-long/2addr v0, v1
|
|
|
|
add-float/2addr v0, v1
|
|
|
|
sub-float/2addr v0, v1
|
|
|
|
mul-float/2addr v0, v1
|
|
|
|
div-float/2addr v0, v1
|
|
|
|
rem-float/2addr v0, v1
|
|
|
|
add-double/2addr v0, v1
|
|
|
|
sub-double/2addr v0, v1
|
|
|
|
mul-double/2addr v0, v1
|
|
|
|
div-double/2addr v0, v1
|
|
|
|
rem-double/2addr v0, v1
|
|
|
|
return-void
|
|
.end method
|
|
|
|
.method public static binary_ops_lit16()V
|
|
.registers 2
|
|
|
|
add-int/lit16 v0, v1, 0x1234
|
|
|
|
rsub-int v0, v1, 0x1234
|
|
|
|
mul-int/lit16 v0, v1, 0x1234
|
|
|
|
div-int/lit16 v0, v1, 0x1234
|
|
|
|
rem-int/lit16 v0, v1, 0x1234
|
|
|
|
and-int/lit16 v0, v1, 0x1234
|
|
|
|
or-int/lit16 v0, v1, 0x1234
|
|
|
|
xor-int/lit16 v0, v1, 0x1234
|
|
|
|
return-void
|
|
.end method
|
|
|
|
.method public static binary_ops_lit8()V
|
|
.registers 2
|
|
|
|
add-int/lit8 v0, v1, 0x12
|
|
|
|
rsub-int/lit8 v0, v1, 0x12
|
|
|
|
mul-int/lit8 v0, v1, 0x12
|
|
|
|
div-int/lit8 v0, v1, 0x12
|
|
|
|
rem-int/lit8 v0, v1, 0x12
|
|
|
|
and-int/lit8 v0, v1, 0x12
|
|
|
|
or-int/lit8 v0, v1, 0x12
|
|
|
|
xor-int/lit8 v0, v1, 0x12
|
|
|
|
shl-int/lit8 v0, v1, 0x12
|
|
|
|
shr-int/lit8 v0, v1, 0x12
|
|
|
|
ushr-int/lit8 v0, v1, 0x12
|
|
|
|
return-void
|
|
.end method
|
|
|
|
.method public static compares()V
|
|
.registers 3
|
|
|
|
cmpl-float v0, v1, v2
|
|
|
|
cmpg-float v0, v1, v2
|
|
|
|
cmpl-double v0, v1, v2
|
|
|
|
cmpg-double v0, v1, v2
|
|
|
|
cmp-long v0, v1, v2
|
|
|
|
return-void
|
|
.end method
|
|
|
|
.method public static conditionals()V
|
|
.registers 2
|
|
|
|
if-eq v0, v1, :cond_18
|
|
|
|
if-ne v0, v1, :cond_18
|
|
|
|
if-lt v0, v1, :cond_18
|
|
|
|
if-ge v0, v1, :cond_18
|
|
|
|
if-gt v0, v1, :cond_18
|
|
|
|
if-le v0, v1, :cond_18
|
|
|
|
if-eqz v0, :cond_18
|
|
|
|
if-nez v0, :cond_18
|
|
|
|
if-ltz v0, :cond_18
|
|
|
|
if-gez v0, :cond_18
|
|
|
|
if-gtz v0, :cond_18
|
|
|
|
if-lez v0, :cond_18
|
|
|
|
:cond_18
|
|
return-void
|
|
.end method
|
|
|
|
.method public static constants()V
|
|
.registers 1
|
|
|
|
const/4 v0, 0x1
|
|
|
|
const/16 v0, 0x1234
|
|
|
|
const v0, 0x12345678
|
|
|
|
const/high16 v0, 0x12340000
|
|
|
|
const-wide/16 v0, 0x1234
|
|
|
|
const-wide/32 v0, 0x12345678
|
|
|
|
const-wide v0, 0x1234567890abcdefL # 5.626349108908516E-221
|
|
|
|
const-wide/high16 v0, 0x1234000000000000L
|
|
|
|
const-string v0, "string"
|
|
|
|
const-string/jumbo v0, "string"
|
|
|
|
const-class v0, Ljava/lang/Object;
|
|
|
|
return-void
|
|
.end method
|
|
|
|
.method public static misc()V
|
|
.registers 5
|
|
|
|
nop
|
|
|
|
monitor-enter v0
|
|
|
|
monitor-exit v0
|
|
|
|
check-cast v0, Ljava/lang/Object;
|
|
|
|
instance-of v0, v1, Ljava/lang/Object;
|
|
|
|
array-length v0, v1
|
|
|
|
new-instance v0, Ljava/lang/Object;
|
|
|
|
new-array v0, v1, Ljava/lang/Object;
|
|
|
|
filled-new-array {v0, v1, v2, v3, v4}, [Ljava/lang/Object;
|
|
|
|
filled-new-array/range {v0 .. v4}, [Ljava/lang/Object;
|
|
|
|
fill-array-data v0, :array_1e
|
|
|
|
throw v0
|
|
|
|
goto :goto_1c
|
|
|
|
goto/16 :goto_1c
|
|
|
|
goto/32 :goto_1c
|
|
|
|
:goto_1c
|
|
return-void
|
|
|
|
nop
|
|
|
|
:array_1e
|
|
.array-data 4
|
|
0x1
|
|
0x2
|
|
0x3
|
|
0x4
|
|
0x5
|
|
0x6
|
|
0x7
|
|
0x8
|
|
0x9
|
|
0x0
|
|
.end array-data
|
|
.end method
|
|
|
|
.method public static moves()V
|
|
.registers 2
|
|
|
|
move v0, v1
|
|
|
|
move/from16 v0, v1
|
|
|
|
move/16 v0, v1
|
|
|
|
move-wide v0, v1
|
|
|
|
move-wide/from16 v0, v1
|
|
|
|
move-wide/16 v0, v1
|
|
|
|
move-object v0, v1
|
|
|
|
move-object/from16 v0, v1
|
|
|
|
move-object/16 v0, v1
|
|
|
|
move-result v0
|
|
|
|
move-result-wide v0
|
|
|
|
move-result-object v0
|
|
|
|
move-exception v0
|
|
|
|
return-void
|
|
.end method
|
|
|
|
.method public static packed_switch()V
|
|
.registers 1
|
|
|
|
packed-switch v0, :pswitch_data_8
|
|
|
|
:goto_3
|
|
return-void
|
|
|
|
goto :goto_3
|
|
|
|
:pswitch_5
|
|
goto :goto_3
|
|
|
|
:pswitch_6
|
|
goto :goto_3
|
|
|
|
nop
|
|
|
|
:pswitch_data_8
|
|
.packed-switch 0x7ffffffe
|
|
:pswitch_5
|
|
:pswitch_6
|
|
.end packed-switch
|
|
.end method
|
|
|
|
.method public static return32()I
|
|
.registers 1
|
|
|
|
return v0
|
|
.end method
|
|
|
|
.method public static return64()I
|
|
.registers 2
|
|
|
|
return-wide v0
|
|
.end method
|
|
|
|
.method public static return_object()Ljava/lang/Object;
|
|
.registers 1
|
|
|
|
return-object v0
|
|
.end method
|
|
|
|
.method public static sparse_switch()V
|
|
.registers 2
|
|
|
|
sparse-switch v0, :sswitch_data_4
|
|
|
|
:sswitch_3
|
|
return-void
|
|
|
|
:sswitch_data_4
|
|
.sparse-switch
|
|
0x1111 -> :sswitch_3
|
|
0x2222 -> :sswitch_3
|
|
0x3333 -> :sswitch_3
|
|
0x4444 -> :sswitch_3
|
|
.end sparse-switch
|
|
.end method
|
|
|
|
.method public static static_fields()V
|
|
.registers 1
|
|
|
|
sget v0, LA;->sI:I
|
|
|
|
sget-wide v0, LA;->sJ:J
|
|
|
|
sget-object v0, LA;->sO:LA;
|
|
|
|
sget-boolean v0, LA;->sZ:Z
|
|
|
|
sget-byte v0, LA;->sB:B
|
|
|
|
sget-char v0, LA;->sC:C
|
|
|
|
sget-short v0, LA;->sS:S
|
|
|
|
sput v0, LA;->sI:I
|
|
|
|
sput-wide v0, LA;->sJ:J
|
|
|
|
sput-object v0, LA;->sO:LA;
|
|
|
|
sput-boolean v0, LA;->sZ:Z
|
|
|
|
sput-byte v0, LA;->sB:B
|
|
|
|
sput-char v0, LA;->sC:C
|
|
|
|
sput-short v0, LA;->mS:S
|
|
|
|
return-void
|
|
.end method
|
|
|
|
.method public static unary_ops()V
|
|
.registers 2
|
|
|
|
neg-int v0, v1
|
|
|
|
not-int v0, v1
|
|
|
|
neg-long v0, v1
|
|
|
|
not-long v0, v1
|
|
|
|
neg-float v0, v1
|
|
|
|
neg-double v0, v1
|
|
|
|
int-to-long v0, v1
|
|
|
|
int-to-float v0, v1
|
|
|
|
int-to-double v0, v1
|
|
|
|
long-to-int v0, v1
|
|
|
|
long-to-float v0, v1
|
|
|
|
long-to-double v0, v1
|
|
|
|
float-to-int v0, v1
|
|
|
|
float-to-long v0, v1
|
|
|
|
float-to-double v0, v1
|
|
|
|
double-to-int v0, v1
|
|
|
|
double-to-long v0, v1
|
|
|
|
double-to-float v0, v1
|
|
|
|
int-to-byte v0, v1
|
|
|
|
int-to-char v0, v1
|
|
|
|
int-to-short v0, v1
|
|
|
|
return-void
|
|
.end method
|
|
|
|
|
|
# virtual methods
|
|
.method public instance_fields()V
|
|
.registers 2
|
|
|
|
iget v0, p0, LA;->sI:I
|
|
|
|
iget-wide v0, p0, LA;->sJ:J
|
|
|
|
iget-object v0, p0, LA;->sO:LA;
|
|
|
|
iget-boolean v0, p0, LA;->sZ:Z
|
|
|
|
iget-byte v0, p0, LA;->sB:B
|
|
|
|
iget-char v0, p0, LA;->sC:C
|
|
|
|
iget-short v0, p0, LA;->sS:S
|
|
|
|
iput v0, p0, LA;->sI:I
|
|
|
|
iput-wide v0, p0, LA;->sJ:J
|
|
|
|
iput-object v0, p0, LA;->sO:LA;
|
|
|
|
iput-boolean v0, p0, LA;->sZ:Z
|
|
|
|
iput-byte v0, p0, LA;->sB:B
|
|
|
|
iput-char v0, p0, LA;->sC:C
|
|
|
|
iput-short v0, p0, LA;->sS:S
|
|
|
|
return-void
|
|
.end method
|
|
|
|
.method public invokes()V
|
|
.registers 5
|
|
|
|
invoke-virtual {v0, v1, v2, v3, p0}, LA;->invokes()V
|
|
|
|
invoke-super {v0, v1, v2, v3, p0}, LA;->invokes()V
|
|
|
|
invoke-direct {v0, v1, v2, v3, p0}, LA;->invokes()V
|
|
|
|
invoke-static {v0, v1, v2, v3, p0}, LA;->invokes()V
|
|
|
|
invoke-interface {v0, v1, v2, v3, p0}, LA;->invokes()V
|
|
.end method
|