资源描述:
《用smali写一个加法程序》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、最近对移动端产生了很浓厚的兴趣,那就开始学习吧!因为还有工作任务,忙里偷闲把丰生强的前3章认真读了一遍。小结内容是说必须熟练掌握这一部分的内容,可通过手动编写Dalvik汇编代码来熟悉一下指令,为后面的分析夯实好基础。书上的是一个显示HelloWorld的例子,为了练习好基础。准备要用Dalvik汇编写一个简单的程序,功能如下:按照书上的,把框架搭好如下:代码:.class public Ltest;.super Ljava/lang/Object;.method public constructor <
2、init>()V#寄存器数量待定 .registers 1 .parameter.prologue return-void.end method思路:由于要传2个参数进去计算,并不是像书上的例子一样,只是打印出一行字,所以要弄清楚参数是如何传进去的。写一个简单的程序反编译看看。程序代码:代码:public class test2 { public static void main(String[] args) { String a = args[0]; }}编译成sma
3、li代码先看看参数是怎么样传进去的,smali代码如下:代码:.class public Ltest2;.super Ljava/lang/Object;.source "test2.java"# direct methods.method public constructor ()V .registers 1 .prologue .line 1 invoke-direct {p0}, Ljava/lang/Object;->()V return-vo
4、id.end method.method public static main([Ljava/lang/String;)V .registers 2 .prologue .line 4 const/4 v0, 0x0 aget-object v0, p0, v0 .line 6 return-void.end method发现除了main函数外还有一个direct method:代码:.method public constructor ()V表示该类
5、的不带参数缺省的构造方法看来这就是传参的关键。代码:const/4 v0, 0x0 aget-object v0, p0, v0Main函数中用这2句的接受传进来的值。所以应该先添加这个构造方法:代码:# direct methods.method public constructor ()V .registers 1 .prologue invoke-direct {p0}, Ljava/lang/Object;->()V return-void.end
6、method接着写代码如下:代码:#V0 V1 清零 const/4 v0, 0x0 const/4 v1, 0x0#接收传进来的2个参数 aget-object v0, p0, v0 aget-object v1, p0, v1#把第一个参数转化成int类型 给vo invoke-static {v0}, Ljava/lang/Integer;->parseInt(Ljava/lang/String;)I move-result v0#把第二个参数转化成int类型 给v1 in
7、voke-static {v1}, Ljava/lang/Integer;->parseInt(Ljava/lang/String;)I move-result v1#两个参数相加 值存 给vo add-int/2addr v0, v1#把vo中的结果转化成String类型 再给v0 invoke-static {v0}, Ljava/lang/String;->valueOf(I)Ljava/lang/String; move-result-object v0#构造一个Str
8、ing类型对象的新实例 把值赋给v2 new-instance v2, Ljava/lang/StringBuilder;#调用实例的直接方法 invoke-direct {v2}, Ljava/lang/StringBuilder;->()V#定义一个字符串常量 const-string v3, "The Sum is :"#调用实例方法,把v3与v2里的字符串相加再给v2 invoke-vir