本文采用smali语法来编写一段Dalvik指令集代码并测试运行。
- 新建文件
HelloWorld.smali
写一段HelloWorld类的架构代码。这里定义了一个可以编译运行的DEX文件的最小部分。
.class public LHelloWorld; #定义类名
.super Ljava/lang/Object; #定义父类
.method public static main([Ljava/lang/String;)V #声明静态main()方法
.registers 4 #使用v0 v1 v2寄存器和一个参数寄存器
.prologue #代码起始指令
return-void #返回空值
.end method
- 然后我们在
.prologue
指令下加入逻辑代码。
最终代码:
.class public LHelloWorld; #定义类名
.super Ljava/lang/Object; #定义父类
.method public static main([Ljava/lang/String;)V #声明静态main()方法
.registers 4 #使用v0 v1 v2寄存器和一个参数寄存器
.prologue #代码起始指令
#空指令
nop
nop
nop
nop
#数据定义指令
const/16 v0,0x8
const/4 v1,0x5
const/4 v2,0x3
#数据操作指令
move v1, v2
#数组操作指令
new-array v0,v0,[I
array-length v1, v0
#实例操作指令
new-instance v1, Ljava/lang/StringBuilder;
#方法调用指令
invoke-direct {v1}, Ljava/lang/StringBuilder;-><init>()V
#跳转指令
if-nez v0, :cond_0
goto :goto_0
:cond_0
#数据转换指令
int-to-float v2,v2
#数据运算指令
add-float v2, v2, v2
#比较指令
cmpl-float v0, v2, v2
#字段操作指令
sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream;
const-string v1, "Hello World, HAPPY."
#方法调用指令
invoke-virtual {v0,v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V
#返回指令
:goto_0
return-void #返回空值
.end method
- 编译smali文件
可以在https://bitbucket.org/JesusFreke/smali/downloads
下载最新的smali.jar
工具
java -jar smali-2.2.4.jar -assemble Helloworld.dex HelloWorld.smali
- 测试运行
adb push E:\out.dex /sdcard/
adb shell dalvikvm -cp /sdcard/out.dex HelloWorld
Comments | 1 条评论