Dalvik指令练习

发布于 2019-05-13  26 次阅读


本文采用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