本文是
Dalvik指令集 的小练习
新建一个文本文件改名为HelloWorld.smali,然后写出HelloWorld类的程序代码如下
- .class public LHelloWorld; #定义类名
- .super Ljava/lang/Object; #定义父类
- .method public static main([Ljava/lang/String;)V #声明静态main()方法
- .registers 4 #程序中使用v0、v1、v2寄存器和一个参数寄存器
- .parameter #一个参数
- .prologue #代码起始指令
- #空指令
- nop
- nop
- nop
- nop
- #数据定义指令 v0 = 8; v1 = 5; v2 = 3;
- const/16 v0, 0x8
- const/4 v1, 0x5
- const/4 v2, 0x3
- #数据操作指令 v1 = v2;
- move v1, v2
- #数组操作指令 v0 = new int[v0]; v1 = v0
- new-array v0, v0, [I
- array-length v1, v0
- #实例操作指令 v1 = new StringBuilder();
- new-instance v1, Ljava/lang/StringBuilder;
- #方法调用指令 v1.init();
- invoke-direct {v1}, Ljava/lang/StringBuilder;-><init>()V
- #跳转指令 if(v0 != 0)
- if-nez v0, :cond_0
- goto :goto_0
- :cond_0
- #数据运算指令 v2 = v2 << v2; (v2 == 24)
- shl-int v2, v2, v2
- #数据转换指令 v2 = (float) v2;
- int-to-float v2, v2
- #数据运算指令 v2 += v2; (v2 == 48.0)
- add-float v2, v2, v2
- #比较指令 v0 = v2 < v2; (v0 == 0)
- cmpl-float v0, v2, v2
- #字段操作指令 PrintStream v0 = System.out; v1 = "Hello World"
- sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream;
- const-string v1, "Hello World" #构造字符串
- #方法调用指令 v0.println(v1); v0.println(v2);
- invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V
- invoke-virtual {v0, v2}, Ljava/io/PrintStream;->println(F)V
- #返回指令
- :goto_0
- return-void #返回空
- .end method
接下来编译smali文件,需要用到smali.jar。在cmd输入如下命令(smali.jar 和 HelloWorld.smali 在同一个目录):
java -jar smali.jar -o classes.dex HelloWorld.smali
将生成的classes.dex 压缩.zip格式
连接
Android设备或模拟器 ,在cmd输入如下命令
adb push classes.zip /data/local
adb shell dalvikvm -cp /data/local/classes.zip HelloWorld
效果截图