用Smali写一个加法程序.docxVIP

  1. 1、本文档共4页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
用Smali写一个加法程序

最近对移动端产生了很浓厚的兴趣,那就开始学习吧!因为还有工作任务,忙里偷闲把丰生强的前3章认真读了一遍。小结内容是说必须熟练掌握这一部分的内容,可通过手动编写Dalvik汇编代码来熟悉一下指令,为后面的分析夯实好基础。书上的是一个显示HelloWorld的例子,为了练习好基础。准备要用Dalvik汇编写一个简单的程序,功能如下:按照书上的,把框架搭好如下:代码:.class?public?Ltest;.super?Ljava/lang/Object;.method?public?constructor?init()V#寄存器数量待定????.registers?1?.parameter.prologue????return-void.end?method思路:由于要传2个参数进去计算,并不是像书上的例子一样,只是打印出一行字,所以要弄清楚参数是如何传进去的。写一个简单的程序反编译看看。程序代码:代码:public?class?test2?{??public?static?void?main(String[]?args)?{????String?a?=?args[0];?????????}}编译成smali代码先看看参数是怎么样传进去的,smali代码如下:代码:.class?public?Ltest2;.super?Ljava/lang/Object;.source?test2.java#?direct?methods.method?public?constructor?init()V????.registers?1????.prologue????.line?1????invoke-direct?{p0},?Ljava/lang/Object;-init()V????return-void.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?init()V表示该类的不带参数缺省的构造方法看来这就是传参的关键。代码:const/4?v0,?0x0?aget-object?v0,?p0,?v0Main函数中用这2句的接受传进来的值。所以应该先添加这个构造方法:代码:#?direct?methods.method?public?constructor?init()V????.registers?1????.prologue????invoke-direct?{p0},?Ljava/lang/Object;-init()V????return-void.end?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????invoke-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#构造一个String类型对象的新实例?把值赋给v2????new-instance?v2,?Ljava/lang/StringBuilder;#调用实例的直接方法????invoke-direct?{v2},?Ljava/lang/StringBuilder;-init()V#定义一个字符串常量????const-string?v3,?The?Sum?is?:#调用实例方法,把v3与v2里的字符串相加再给v2?invoke-virtual{v2,v3},Ljava/lang/S

文档评论(0)

junjun37473 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档