各种条件控制语句的smali表达
2017-03-02 17:17
387 查看
Java代码
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_my); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); fab.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) .setAction("Action", null).show(); } }); sum(5); compile(10, 20); } public Integer sum(int times){ Integer sum = 5; for (int i = 0; i < times; i++){ sum += i; } return sum; } public boolean complete(Integer a, Integer b){ if (a >= b){ return true; } else { return false; } }
Smali代码
调用部分
.method protected onCreate(Bundle)V .registers 6 .param p1, "savedInstanceState" .prologue 00000000 invoke-super AppCompatActivity->onCreate(Bundle)V, p0, p1 00000006 const v2, 0x7F04001B # R.layout.activity_my 0000000C invoke-virtual MyActivity->setContentView(I)V, p0, v2 00000012 const v2, 0x7F0C006D # R.id.toolbar 00000018 invoke-virtual MyActivity->findViewById(I)View, p0, v2 0000001E move-result-object v1 00000020 check-cast v1, Toolbar .local v1, "toolbar":Landroid/support/v7/widget/Toolbar; 00000024 invoke-virtual MyActivity->setSupportActionBar(Toolbar)V, p0, v1 0000002A const v2, 0x7F0C006E # R.id.fab 00000030 invoke-virtual MyActivity->findViewById(I)View, p0, v2 00000036 move-result-object v0 00000038 check-cast v0, FloatingActionButton .local v0, "fab":Landroid/support/design/widget/FloatingActionButton; 0000003C new-instance v2, MyActivity$1 00000040 invoke-direct MyActivity$1-><init>(MyActivity)V, v2, p0 00000046 invoke-virtual FloatingActionButton->setOnClickListener(View$OnClickListener)V, v0, v2 0000004C const/4 v2, 5 0000004E invoke-virtual MyActivity->sum(I)Integer, p0, v2 # p0是this指针,v2是sum的参数 00000054 const/16 v2, 0x000A # 在上个函数使用完后v2已经无用,被重新赋值 00000058 invoke-static Integer->valueOf(I)Integer, v2 # 原java代码里使用的Integer对象,这里使用valueof方法转换成int型 0000005E move-result-object v2 00000060 const/16 v3, 0x0014 00000064 invoke-static Integer->valueOf(I)Integer, v3 0000006A move-result-object v3 0000006C invoke-virtual MyActivity->complete(Integer, Integer)Z, p0, v2, v3 # 返回值boolean类型,p0是this指针,v2、v3是参数,调用complete方法 00000072 return-void .end method
for循环
.method public sum(I)Integer .registers 5 .param p1, "times" .prologue 00000000 const/4 v2, 5 # 局部变量初始化赋值为5 00000002 invoke-static Integer->valueOf(I)Integer, v2 00000008 move-result-object v1 # 返回值sum .local v1, "sum":Ljava/lang/Integer; 0000000A const/4 v0, 0 # for循环中的i的初始化赋值为0 :C .local v0, "i":I 0000000C if-ge v0, p1, :28 # 比较v0是否大于p1,如果大于则跳到标签28处 :10 00000010 invoke-virtual Integer->intValue()I, v1 00000016 move-result v2 00000018 add-int/2addr v2, v0 # sum = sum + i 0000001A invoke-static Integer->valueOf(I)Integer, v2 00000020 move-result-object v1 00000022 add-int/lit8 v0, v0, 0x01 # i++ 00000026 goto :C # 跳回标签C处 :28 00000028 return-object v1 # 返回结果 .end method
if判断
.method public complete(Integer, Integer)Z .registers 5 .param p1, "a" .param p2, "b" .prologue 00000000 invoke-virtual Integer->intValue()I, p1 00000006 move-result v0 00000008 invoke-virtual Integer->intValue()I, p2 0000000E move-result v1 00000010 if-lt v0, v1, :18 # 如果v0小于v1则跳转到标签18处 :14 00000014 const/4 v0, 1 # 为返回值赋值为“真” :16 00000016 return v0 # 返回结果 :18 00000018 const/4 v0, 0 # 为返回值赋值为“假” 0000001A goto :16 # 此处的意思是,上面的上下文会给返回值赋值,执行完成之后,跳到标签16处返回 .end method
switch语句1(有序型)
java代码
public void switchTest1(Integer caseE) { switch (caseE) { case 1: System.out.println("This is " + caseE); break; case 2: System.out.println("This is " + caseE); break; case 3: System.out.println("This is " + caseE); break; case 4: System.out.println("This is " + caseE); break; default: System.out.println("This is default"); break; } }
smali代码
.method public switchTest1(Integer)V .registers 5 .param p1, "caseE" .prologue 00000000 invoke-virtual Integer->intValue()I, p1 00000006 move-result v0 00000008 packed-switch v0, :E8 :E 0000000E sget-object v0, System->out:PrintStream 00000012 const-string v1, "This is default" 00000016 invoke-virtual PrintStream->println(String)V, v0, v1 :1C 0000001C return-void :1E 0000001E sget-object v0, System->out:PrintStream 00000022 new-instance v1, StringBuilder 00000026 invoke-direct StringBuilder-><init>()V, v1 0000002C const-string v2, "This is " 00000030 invoke-virtual StringBuilder->append(String)StringBuilder, v1, v2 00000036 move-result-object v1 00000038 invoke-virtual StringBuilder->append(Object)StringBuilder, v1, p1 0000003E move-result-object v1 00000040 invoke-virtual StringBuilder->toString()String, v1 00000046 move-result-object v1 00000048 invoke-virtual PrintStream->println(String)V, v0, v1 0000004E goto :1C :50 00000050 sget-object v0, System->out:PrintStream 00000054 new-instance v1, StringBuilder 00000058 invoke-direct StringBuilder-><init>()V, v1 0000005E const-string v2, "This is " 00000062 invoke-virtual StringBuilder->append(String)StringBuilder, v1, v2 00000068 move-result-object v1 0000006A invoke-virtual StringBuilder->append(Object)StringBuilder, v1, p1 00000070 move-result-object v1 00000072 invoke-virtual StringBuilder->toString()String, v1 00000078 move-result-object v1 0000007A invoke-virtual PrintStream->println(String)V, v0, v1 00000080 goto :1C :82 00000082 sget-object v0, System->out:PrintStream 00000086 new-instance v1, StringBuilder 0000008A invoke-direct StringBuilder-><init>()V, v1 00000090 const-string v2, "This is " 00000094 invoke-virtual StringBuilder->append(String)StringBuilder, v1, v2 0000009A move-result-object v1 0000009C invoke-virtual StringBuilder->append(Object)StringBuilder, v1, p1 000000A2 move-result-object v1 000000A4 invoke-virtual StringBuilder->toString()String, v1 000000AA move-result-object v1 000000AC invoke-virtual PrintStream->println(String)V, v0, v1 000000B2 goto :1C :B4 000000B4 sget-object v0, System->out:PrintStream 000000B8 new-instance v1, StringBuilder 000000BC invoke-direct StringBuilder-><init>()V, v1 000000C2 const-string v2, "This is " 000000C6 invoke-virtual StringBuilder->append(String)StringBuilder, v1, v2 000000CC move-result-object v1 000000CE invoke-virtual StringBuilder->append(Object)StringBuilder, v1, p1 000000D4 move-result-object v1 000000D6 invoke-virtual StringBuilder->toString()String, v1 000000DC move-result-object v1 000000DE invoke-virtual PrintStream->println(String)V, v0, v1 000000E4 goto :1C :E8 000000E8 .packed-switch 0x1 :1E :50 :82 :B4 .end packed-switch .end method
switch语句2(无序型1)
java代码
public void switchTest2(Integer caseE) { switch (caseE) { case 10: System.out.println("This is " + caseE); break; case 5: System.out.println("This is " + caseE); break; case 26: System.out.println("This is " + caseE); break; case 58: System.out.println("This is " + caseE); break; default: System.out.println("This is default"); break; } }
smali代码
.method public switch 1167a Test2(Integer)V .registers 5 .param p1, "caseE" .prologue 00000000 invoke-virtual Integer->intValue()I, p1 00000006 move-result v0 00000008 sparse-switch v0, :E8 :E 0000000E sget-object v0, System->out:PrintStream 00000012 const-string v1, "This is default" 00000016 invoke-virtual PrintStream->println(String)V, v0, v1 :1C 0000001C return-void :1E 0000001E sget-object v0, System->out:PrintStream 00000022 new-instance v1, StringBuilder 00000026 invoke-direct StringBuilder-><init>()V, v1 0000002C const-string v2, "This is " 00000030 invoke-virtual StringBuilder->append(String)StringBuilder, v1, v2 00000036 move-result-object v1 00000038 invoke-virtual StringBuilder->append(Object)StringBuilder, v1, p1 0000003E move-result-object v1 00000040 invoke-virtual StringBuilder->toString()String, v1 00000046 move-result-object v1 00000048 invoke-virtual PrintStream->println(String)V, v0, v1 0000004E goto :1C :50 00000050 sget-object v0, System->out:PrintStream 00000054 new-instance v1, StringBuilder 00000058 invoke-direct StringBuilder-><init>()V, v1 0000005E const-string v2, "This is " 00000062 invoke-virtual StringBuilder->append(String)StringBuilder, v1, v2 00000068 move-result-object v1 0000006A invoke-virtual StringBuilder->append(Object)StringBuilder, v1, p1 00000070 move-result-object v1 00000072 invoke-virtual StringBuilder->toString()String, v1 00000078 move-result-object v1 0000007A invoke-virtual PrintStream->println(String)V, v0, v1 00000080 goto :1C :82 00000082 sget-object v0, System->out:PrintStream 00000086 new-instance v1, StringBuilder 0000008A invoke-direct StringBuilder-><init>()V, v1 00000090 const-string v2, "This is " 00000094 invoke-virtual StringBuilder->append(String)StringBuilder, v1, v2 0000009A move-result-object v1 0000009C invoke-virtual StringBuilder->append(Object)StringBuilder, v1, p1 000000A2 move-result-object v1 000000A4 invoke-virtual StringBuilder->toString()String, v1 000000AA move-result-object v1 000000AC invoke-virtual PrintStream->println(String)V, v0, v1 000000B2 goto :1C :B4 000000B4 sget-object v0, System->out:PrintStream 000000B8 new-instance v1, StringBuilder 000000BC invoke-direct StringBuilder-><init>()V, v1 000000C2 const-string v2, "This is " 000000C6 invoke-virtual StringBuilder->append(String)StringBuilder, v1, v2 000000CC move-result-object v1 000000CE invoke-virtual StringBuilder->append(Object)StringBuilder, v1, p1 000000D4 move-result-object v1 000000D6 invoke-virtual StringBuilder->toString()String, v1 000000DC move-result-object v1 000000DE invoke-virtual PrintStream->println(String)V, v0, v1 000000E4 goto :1C :E8 000000E8 .sparse-switch 0x5 -> :50 0xA -> :1E 0x1A -> :82 0x3A -> :B4 .end sparse-switch .end method
switch语句2(无序型2)
java代码
public void switchTest3(String caseE) { switch (caseE) { case "FILE": System.out.println("This is " + caseE); break; case "CMD": System.out.println("This is " + caseE); break; case "INTERNET": System.out.println("This is " + caseE); break; case "PROCESS": System.out.println("This is " + caseE); break; default: System.out.println("This is default"); break; } }
smali代码
.method public switchTest3(String)V .registers 5 .param p1, "caseE" .prologue 00000000 const/4 v0, -1 00000002 invoke-virtual String->hashCode()I, p1 00000008 move-result v1 0000000A sparse-switch v1, :140 :10 00000010 packed-switch v0, :164 :16 00000016 sget-object v0, System->out:PrintStream 0000001A const-string v1, "This is default" 0000001E invoke-virtual PrintStream->println(String)V, v0, v1 :24 00000024 return-void :26 00000026 const-string v1, "FILE" 0000002A invoke-virtual String->equals(Object)Z, p1, v1 00000030 move-result v1 00000032 if-eqz v1, :10 :36 00000036 const/4 v0, 0 00000038 goto :10 :3A 0000003A const-string v1, "CMD" 0000003E invoke-virtual String->equals(Object)Z, p1, v1 00000044 move-result v1 00000046 if-eqz v1, :10 :4A 0000004A const/4 v0, 1 0000004C goto :10 :4E 0000004E const-string v1, "INTERNET" 00000052 invoke-virtual String->equals(Object)Z, p1, v1 00000058 move-result v1 0000005A if-eqz v1, :10 :5E 0000005E const/4 v0, 2 00000060 goto :10 :62 00000062 const-string v1, "PROCESS" 00000066 invoke-virtual String->equals(Object)Z, p1, v1 0000006C move-result v1 0000006E if-eqz v1, :10 :72 00000072 const/4 v0, 3 00000074 goto :10 :76 00000076 sget-object v0, System->out:PrintStream 0000007A new-instance v1, StringBuilder 0000007E invoke-direct StringBuilder-><init>()V, v1 00000084 const-string v2, "This is " 00000088 invoke-virtual StringBuilder->append(String)StringBuilder, v1, v2 0000008E move-result-object v1 00000090 invoke-virtual StringBuilder->append(String)StringBuilder, v1, p1 00000096 move-result-object v1 00000098 invoke-virtual StringBuilder->toString()String, v1 0000009E move-result-object v1 000000A0 invoke-virtual PrintStream->println(String)V, v0, v1 000000A6 goto :24 :A8 000000A8 sget-object v0, System->out:PrintStream 000000AC new-instance v1, StringBuilder 000000B0 invoke-direct StringBuilder-><init>()V, v1 000000B6 const-string v2, "This is " 000000BA invoke-virtual StringBuilder->append(String)StringBuilder, v1, v2 000000C0 move-result-object v1 000000C2 invoke-virtual StringBuilder->append(String)StringBuilder, v1, p1 000000C8 move-result-object v1 000000CA invoke-virtual StringBuilder->toString()String, v1 000000D0 move-result-object v1 000000D2 invoke-virtual PrintStream->println(String)V, v0, v1 000000D8 goto :24 :DA 000000DA sget-object v0, System->out:PrintStream 000000DE new-instance v1, StringBuilder 000000E2 invoke-direct StringBuilder-><init>()V, v1 000000E8 const-string v2, "This is " 000000EC invoke-virtual StringBuilder->append(String)StringBuilder, v1, v2 000000F2 move-result-object v1 000000F4 invoke-virtual StringBuilder->append(String)StringBuilder, v1, p1 000000FA move-result-object v1 000000FC invoke-virtual StringBuilder->toString()String, v1 00000102 move-result-object v1 00000104 invoke-virtual PrintStream->println(String)V, v0, v1 0000010A goto :24 :10C 0000010C sget-object v0, System->out:PrintStream 00000110 new-instance v1, StringBuilder 00000114 invoke-direct StringBuilder-><init>()V, v1 0000011A const-string v2, "This is " 0000011E invoke-virtual StringBuilder->append(String)StringBuilder, v1, v2 00000124 move-result-object v1 00000126 invoke-virtual StringBuilder->append(String)StringBuilder, v1, p1 0000012C move-result-object v1 0000012E invoke-virtual StringBuilder->toString()String, v1 00000134 move-result-object v1 00000136 invoke-virtual PrintStream->println(String)V, v0, v1 0000013C goto/16 :24 :140 00000140 .sparse-switch 0x1051A -> :3A 0x20ED7C -> :26 0x1858AA4F -> :62 0x50A5B741 -> :4E .end sparse-switch :164 00000164 .packed-switch 0x0 :76 :A8 :DA :10C .end packed-switch .end method
相关文章推荐
- sql语句中的条件控制 case ..when.
- 第01章 CORE C++_C++ 基本结构_注释_输出语句_输入语句_初始化_条件控制_ASCII码值_转义字符_常量_变量_类型长度_运算符
- linux shell 流程控制(条件if,循环【for,while】,选择【case】语句实例
- linux shell 流程控制(条件if,循环【for,while】,选择【case】语句实例
- DB2 CASE/IF 条件控制语句
- 第十一课:条件控制语句
- linux shell 流程控制(条件if,循环【for,while】,选择【case】语句实例
- linux shell 流程控制(条件if,循环【for,while】,选择【case】语句实例
- If IE Html里面的条件控制语句
- 关于浮点数出现在条件控制语句中的问题
- linux之 条件测试 和 控制语句概述
- C#基础--运算符及条件控制语句
- 第七讲 : 流程控制-条件分支语句 -【天轰穿.Net4趣味编程系列视频教程-vs2010轻松学习C#视频教程】
- PHP之三,条件控制语句
- php条件控制语句
- linux shell 流程控制(条件if,循环【for,while】,选择【case】语句实例
- linux shell 流程控制(条件if,循环【for,while】,选择【case】语句实例
- T-SQL编程:条件控制语句
- JAVA基础第二天学习日记_标识符、常量与变量、运算符、条件控制语句
- linux shell 流程控制(条件if,循环【for,while】,选择【case】语句实例