选择结构(if-else)

smali条件跳转分支语法

if-<条件> v0 v1,:cond_** // 如果v0<条件>v1成立,则跳转到:cond_**处的代码。
if-eq vA, vB, :cond_1f   //如果vA等于vB则程序跳转到:cond_1f处的代码执,行。

条件判断关键字如下

条件关键字 意思
if-eq 如果等于
if-ne 如果不等于
if-lt 如果小于
if-le 如果小于等于
if-gt 如果大于
if-ge 如果大于等于
if-eqz 如果等于零
if-nez 如果不等于0
if-ltz 如果小于零
if-lez 如果小于等于零
if-gtz 如果大于零
if-gez 如果大于等于零

java代码

int a = 2;
int b = 3;
int c = 4;
private void ifelseMethod() {if (b > c) {Log.d(TAG, "b>c");} else if (b > a) {Log.d(TAG, "b>a");} else {Log.d(TAG, "b<a, b<c");}
}  

smali代码

.method private ifelseMethod()V.registers 3.prologue.line 65iget v0, p0, Lcom/example/user/smalitest/MainActivity;->b:I#v0--biget v1, p0, Lcom/example/user/smalitest/MainActivity;->c:I#v1--cif-le v0, v1, :cond_e #如果v0小于等于v1(java代码中if(b>c)不成立)则跳转到:cond_e处执行代码(第24行),否则接着往下执行.line 66iget-object v0, p0, Lcom/example/user/smalitest/MainActivity;->TAG:Ljava/lang/String;#这里是(b>c)情况下执行的代码const-string v1, "b>c"invoke-static {v0, v1}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I.line 73:goto_d#标记:goto_d,   在其他地方的代码出现goto :goto_d,程序会跳转到这里执行return-void#return void 跳出方法,后边其他的代码都不会执行.line 67:cond_e#标记cond_e, 如果在前边(第10行)"b<=c"的情况下,程序会跳转到cond_e 即这里接着往下执行iget v0, p0, Lcom/example/user/smalitest/MainActivity;->b:I#v0--biget v1, p0, Lcom/example/user/smalitest/MainActivity;->a:I#v0--aif-le v0, v1, :cond_1c#如果v0小于等于v1(java中 b>a)跳转到:cond_1c处(第41行)执行,否则接着往下执行.line 68iget-object v0, p0, Lcom/example/user/smalitest/MainActivity;->TAG:Ljava/lang/String;const-string v1, "b>a"invoke-static {v0, v1}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)Igoto :goto_d #跳转到标记为 :goto_d的地方(第20行)执行,.line 70:cond_1ciget-object v0, p0, Lcom/example/user/smalitest/MainActivity;->TAG:Ljava/lang/String;const-string v1, "b<a, b<c"invoke-static {v0, v1}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)Igoto :goto_d
.end method

循环结构

在smali中循环的实现就是通过无条件跳转语句goto 加条件语句if-<条件>相结合实现。

#例如for循环,while循环
:goto_1
if_<条件> v0 v1,  :cond_2 #如果满足条件的时候就跳转到cond_2v处。
#循环内容
goto :goto_1:cond_2
#循环结束的代码

do-while循环

:cond_1 #循环开始
#循环体
if_<条件> v0 v1, :cond_1 #如果满足v0 v1 满足条件 跳转到:cond_1继续循环
#循环结束代码

for循环例子

java代码

private void forMethod() {for (int i = 0; i < 3; i++) {Log.d("TAG", "Button1 Log:" + i);}
}

smali代码

.method private forMethod()v.registers 5.prologue.line 93const/4 v0, 0x0.local v0, "i":I:goto_1     //循环开始const/4 v1, 0x3if-ge v0, v1, :cond_1f   //判断条件 满足v0>=v1 程序跳转到 :cond_1f(跳出循环) v0就是i的值,v1为3(在java中 当不满足i<3时,跳出循环,即当i>=3时).line 94const-string v1, "TAG"new-instance v2, Ljava/lang/StringBuilder;invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()Vconst-string v3, "Button1 Log:"invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;move-result-object v2invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder;move-result-object v2invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;move-result-object v2invoke-static {v1, v2}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I.line 93add-int/lit8 v0, v0, 0x1goto :goto_1  //跳转到 :goto_1 继续循环.line 96:cond_1f  //跳出循环后执行return-void
.end method

while循环例子

java代码

    private void whileMethod() {int k = 0;while (k < 5) {k++;Log.d("TAG", "Button3 Log:" + k);}}

smali代码

.method private whileMethod()V.registers 5.prologue.line 76const/4 v0, 0x0.line 77.local v0, "k":I:goto_1   //循环开始const/4 v1, 0x5  //v1 值为5if-ge v0, v1, :cond_1f 判断条件 如果v0>=v1 跳转到:cond_1f处,否则继续循环(java中当k<5时,继续循环).line 78add-int/lit8 v0, v0, 0x1  //java中k++.line 79const-string v1, "TAG"new-instance v2, Ljava/lang/StringBuilder;invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()Vconst-string v3, "Button3 Log:"invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;move-result-object v2invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder;move-result-object v2invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;move-result-object v2invoke-static {v1, v2}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)Igoto :goto_1 //跳转到goto_1 继续循环.line 81:cond_1f //跳出循环后 从这里继续执行return-void
.end method

do-while循环例子

java代码

    private void doWhileMethod() {int j = 0;do {j++;Log.d("TAG", "Button2 Log:" + j);} while (j < 5);}

smali代码

.method private doWhileMethod()V.registers 5.prologue.line 84const/4 v0, 0x0.line 86.local v0, "j":I:cond_1  //标记:cond_1  从这里开始循环add-int/lit8 v0, v0, 0x1  //java中  j++;.line 87const-string v1, "TAG"new-instance v2, Ljava/lang/StringBuilder;invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()Vconst-string v3, "Button2 Log:"invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;move-result-object v2invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder;move-result-object v2invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;move-result-object v2invoke-static {v1, v2}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I.line 88const/4 v1, 0x5  //v1---5if-lt v0, v1, :cond_1   //如果v0<v1(java中 j<5),就跳转到:cond_1处继续循环.line 90return-void
.end method

分支结构

分支结构在smali中有两种, 第一中,case的值是连续递增的,关键字packed-switch ,如下所示:

packed-switch p1, :pswitch_data_0  #p1为传递进来的要匹配case值的参数
:goto_0
#退出分支结构代码
:pswitch_0
#case0时的程序代码
goto :goto_0    #跳转到分支结构退出代码
:pswitch_1
#程序代码
goto :goto_0
:pswitch_2
#程序代码
goto :goto_0
:pswitch_data_0 .packed-switch 0x0  #case值开始的地方,一次递增:pswitch_0      #case 0::pswitch_1      #case 1::pswitch_2      #case 2:
.end packed-switch 

第二种 ,case值可以为任意值,关键字sparse-switch,如下所示

sparse-switch p1, :switch_data_0    #p1 传进来的参数,跳转到:goto_0   #case 出口
#代码
:pswitch_0   #case 5 跳转到这里
#case值等于5时的程序代码
goto :goto_0    #跳转到分支结构退出代码
:pswitch_1
#程序代码
goto :goto_0
:pswitch_2
#程序代码
goto :goto_0
:pswitch_data_0 .sparse-switch   #case值开始的地方,一次递增0x5 -> :pswitch_0      #case 5:0xf -> :pswitch_1      #case 15:0x23 -> :pswitch_2      #case 35:
.end packed-switch 

java代码

    public void onClick(View view) {switch (view.getId()) {case R.id.btn_1:forMethod();break;case R.id.btn_2:doWhileMethod();break;case R.id.btn_3:whileMethod();break;case R.id.btn_4:ifelseMethod();break;}}

smali代码

.method public onClick(Landroid/view/View;)V.registers 3.param p1, "view"    # Landroid/view/View;.prologue.line 47invoke-virtual {p1}, Landroid/view/View;->getId()Imove-result v0packed-switch v0, :pswitch_data_18 #switch分支开始除,v0为参数 即Java中view.getId()值。.line 62:goto_7return-void.line 49:pswitch_8invoke-direct {p0}, Lcom/example/user/smalitest/MainActivity;->forMethod()Vgoto :goto_7.line 52:pswitch_cinvoke-direct {p0}, Lcom/example/user/smalitest/MainActivity;->doWhileMethod()Vgoto :goto_7.line 55:pswitch_10invoke-direct {p0}, Lcom/example/user/smalitest/MainActivity;->whileMethod()Vgoto :goto_7.line 58:pswitch_14invoke-direct {p0}, Lcom/example/user/smalitest/MainActivity;->ifelseMethod()Vgoto :goto_7.line 47:pswitch_data_18.packed-switch 0x7f0c0050   :pswitch_8:pswitch_c:pswitch_10:pswitch_14.end packed-switch
.end method

smali语言程序流程控制语法相关推荐

  1. c语言程序流程控制(下)

    c语言程序流程控制 嵌套 switch分支结构 语法 例题 switch细节 练习 switch与if语句的比较 循环控制 for循环 练习题 while循环控制 do while 循环 多重循环控制 ...

  2. c 语言程序流程控制应用实验报告,程序流程控制实验报告.doc

    .net程序设计实验报告 2011年 11 月 19日 学 号1008114082姓 名左雪敬时 间下午7-8节专 业计算机科学与技术班 级10级2班实验题目: 程序流程控制实验目的: 1:掌握常量和 ...

  3. c 语言程序流程控制应用实验报告,PLC可编程序控制器及应用课程实验报告

    可编程序控制器及应用课程实验报告 可编程序控制器及应用课程实验报告 <可编程序控制器及应用>实验报告一 实验名称:PLC基本指令实验 1.实验目的与要求 开关量信号的边沿检测. 用PLS ...

  4. 一文带你深入理解【Java基础】· Java基本语法:程序流程控制

    写在前面 Hello大家好, 我是[麟-小白],一位软件工程专业的学生,喜好计算机知识.希望大家能够一起学习进步呀!本人是一名在读大学生,专业水平有限,如发现错误或不足之处,请多多指正!谢谢大家!!! ...

  5. Java笔记2.3——Java基本语法之程序流程控制

    Java基础 Java基本语法(下):程序流程控制 目录 目录 Java基础 Java基本语法(下):程序流程控制 一.程序流程控制 1.理论 2.分支语句1: if-else结构 2.1.if-el ...

  6. Java基本语法-程序流程控制

    程序流程控制 流程控制语句是用来控制程序中各语句执行顺序的语句,可以把语句组合成能完成一定功能的小逻辑模块. 其流程控制方式采用结构化程序设计中规定的三种基本流程结构,即: 顺序结构.分支结构.循环结 ...

  7. 【Java基础】· Java基本语法:程序流程控制习题总结

    写在前面 Hello大家好, 我是[麟-小白],一位软件工程专业的学生,喜好计算机知识.希望大家能够一起学习进步呀!本人是一名在读大学生,专业水平有限,如发现错误或不足之处,请多多指正!谢谢大家!!! ...

  8. C#面向对象程序设计课程实验一:实验名称:C#语言基础、程序流程控制

    C#面向对象程序设计课程实验一:实验名称:C#语言基础.程序流程控制 实验内容:C#语言基础.程序流程控制 一. 实验目的 二.实验环境 三.实验内容 四.实验总结 实验内容:C#语言基础.程序流程控 ...

  9. 学习 尚硅谷_宋红康_第2章_Java基本语法(下):程序流程控制超详细课件

    文章目录 程序流程控制 练习题 笔试题 彩票 结婚判断 switch-case结构的基本使用 练习题 程序流程控制 流程控制语句是用来控制程序中各语句执行顺序的语句,可以把语句组 合成能完成一定功能的 ...

最新文章

  1. 子网地址,广播地址,子网掩码,主机地址范围,求法总结
  2. NSURLRequest的超时陷阱
  3. enum类型被intent所携带时需要注意的地方
  4. Java float浮点数精度丢失问题
  5. batch spring 重复执行_一个3年老javaer竟然连Spring的事务管理都不知道,惊呆了
  6. 在双11大促中的数据库服务器
  7. 前端学习(2852):简单秒杀系统学习之鼠标点击方法
  8. [转][Python小记] 通俗的理解闭包 闭包能帮我们做什么?
  9. python3.6字典有序_为什么Python3.6字典变得有序了?
  10. ZABBIX 3.2 基础安装
  11. 灵异:各国家千年诅咒悬迷——不可思议
  12. 转载:为某燃气公司做的一部卡通角色广告动画
  13. MFQE 2.0: A New Approach for Multi-FrameQuality Enhancement on Compressed Video
  14. 旁路和去耦电容 bypass decouple
  15. Arduino UNO驱动DS1307数字实时时钟RTC
  16. 什么是结构体【详解】
  17. python 画心形线 matplotlib
  18. 米的换算单位和公式_小学数学单位换算公式大全.doc
  19. Vmware 虚拟机安装 Ubuntu
  20. 巨型计算机卡通,动漫史上十大超巨型机体

热门文章

  1. CUDA之GPU生态系统
  2. python之excel编程
  3. snort 轻量级入侵检测系统安装与使用
  4. unity lookat导致物体颠倒怎么解决_在Unity 2D中如何用一行代码实现LookAt的效果,以及向量归一化小总结...
  5. ORAN传输封装类型
  6. u盘中毒文件被隐藏恢复方法
  7. 浅淡深度学习的发机机——张量计算
  8. 如何写一个Vue自定义指令
  9. UPC Haywire(模拟退火 || 随机数法)
  10. 集结Android开发里的各种大神