各种条件控制语句的smali表达

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 switchTest2(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

猜你喜欢

转载自blog.csdn.net/u014021893/article/details/59562739