我是靠谱客的博主 粗犷戒指,最近开发中收集的这篇文章主要介绍smali汇编语言学习总结,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

1、Smali中的包信息

  • .class <访问权限> [修饰关键字] <类名>
  • .super <父类名>
  • .source <源文件名>

.class public Lcom/aaa;

.super Lcom/bbb;

.source "ccc.java"

该smali文件是由ccc.java编译而来的,它是com.aaa这个包下的一个类,继承自com.bbb这个类

2、Smali中的寄存器知识

  • 本地寄存器以v开头数字结尾,如:v0,v1...
  • 参数寄存器以p开头数字结尾,如:p0,p1...
    • p0不一定是函数中的第一个参数,在非static函数中,p0就是“this”的意思,后面的才为函数参数

3、Smali中的函数

函数的整体架构:

.method <访问权限> [修饰关键字] <方法原型>        #方法声明

    <.locals>       #局部变量个数

    [.parameter]       #参数

    [.prologue]        #代码开始处

    [.line]        #源代码行号

    <代码体>

.end method         #方法结束

4、Smali中的数据类型

  • v        void只能用于返回值类型
  • Z        boolean类型
  • B        byte类型
  • S        shot类型
  • C        char类型
  • I          int类型
  • J         long类型
  • F        float类型
  • D        double类型
  • 数组类型:   [  
    • [后面跟着基本数据类型
    • 如:float []    ===>    [F
    • char [][]    ===>      [[C
  • 对象类型:L<包名>/<类名>;
    • 分号表示对象结束
    • String对象 ===> Ljava/lang/String;
    • 内部类前面加 “ $ ” 符号:L<包名>/<类名>$<内部类名>;

5、Smali中的成员变量

  • 格式:.field [访问权限] [修饰关键字] <变量名>:<数据类型>
  • 成员变量的获取指令:iget、sget、iget-boolean、sget-boolean、iget-object、sget-object等
  • 成员变量的操作指令:iput、sput、iput-boolean、sput-boolean、iput-object、sput-object等
  • 除了带有-object和-boolean之外的指令操作的是基本数据类型
  • get指令的使用:
    • 如:sget-object v0, Lcom/aaa;->ID:Ljava/lang/String;
      • 表示的是获取String类型的ID变量的值,并将其存放到v0寄存器中
        • 前面为该变量所属类的类型,在冒号后面表示变量的数据类型,“->”表示所属关系
    • iget-object v0,p0,Lcom/aaa;->view:Lcom/aaa/view;
      • p0为该变量所在类的实例,即“this”
    • 获取数组的话,用aget-object
  • put指令的使用:
    • const/4 v1, 0x0
    • sput-object v3, Lcom/aaa;->timer:Lcom/aaa/timer;    ===>     this.timer=null;
    • 因为给object对象赋值,所以为null
    • .local v0, args:Landroid/os/Message;
    • const/4 v1, 0x12
    • iput v1, v0, Landroid/os/Message;->what:I    ===>     args.what=18;
      • 实例化对象Message为args并存放在寄存器v0中,给v1赋值为0x12,然后使用iput将v1的值赋给args对象的what属性

6、Smali其他基本语法:

  • .invoke-super      #调用父类方法
  • const/high16 v0, 0xadf1     #将0xadf1存放到寄存器v0中
  • invoke-direct      #调用函数
  • return-void       #函数返回void
  • new-instance      #创建实例
  • iput-object      #给对象赋值
  • iget-object      #调用对象
  • invoke-static       #调用静态函数

7、Smali中的条件分支

  • if-eq v1, v2:cond_*    ===> 如果v1=v2则跳转到:cond_*
  • if-ne v1, v2:cond_*    ===> 如果v1≠v2则跳转到:cond_*
  • if-lt v1, v2:cond_*      ===> 如果v1<v2则跳转到:cond_*
  • if-le v1, v2:cond_*     ===> 如果v1<=v2则跳转到:cond_*
  • if-ge v1, v2:cond_*    ===> 如果v1>=v2则跳转到:cond_*
  • if-gt v1, v2:cond_*     ===> 如果v1>v2则跳转到:cond_*
  • if-eqz v1:cond_*        ===> 如果v1=0则跳转到:cond_*
  • if-nez v1:cond_*        ===> 如果v1≠0则跳转到:cond_*
  • if-ltz v1:cond_*          ===> 如果v1<0则跳转到:cond_*
  • if-lez v1:cond_*         ===> 如果v1<=0则跳转到:cond_*
  • if-gtz v1:cond_*         ===> 如果v1>0则跳转到:cond_*
  • if-gez v1:cond_*        ===> 如果v1>=0则跳转到:cond_*

8、Smali中的函数调用

  • 函数分为两种:direct和virtual
  • direct method表示private
  • virtual method表示public、protected
  • 在函数调用时有:invoke-direct、invoke-virtual、invoke-static、invoke-super等
  • 当参数多于4个的时候使用:invoke-xxx/range
  • invoke-static:用于调用静态函数
    • invoke-static {}, Lcom/aaa;->Check()Z
      • {}:里面的东西表示传入函数的实例+参数列表,由于该static函数不需要任何参数所以里面为空
    • const-string v0, "NIUBI"
    • invoke-static {v0}, Ljava/lang/System;->loadLibrary(Ljava/lang/String;)V
      • 这是调用static void System.loadLibrary(String)方法,传入的参数为“NIUBI”
  • invoke-super:调用父类方法,一般用于调用onCreate、onDestroy等方法
  • invoke-direct:调用private函数
    • invoke-direct {p0}, Landroid/app/TabActivity;-><init>()V
      • 这里的<init>就是定义在TabActivity中的private函数
  • invoke-virtual:调用的是public、protected函数
    • sget-object v0, Lcom/aaa;->bbb:Lcom/ccc;
    • invoke-virtual {v0, v1}, Lcom/ccc;->Message(Ljava/lang/Object;)V
      • v0是Lcom/ccc
      • v1是传给Message方法的Ljava/lang/Object;参数
      • public void ccc.Message(Object)
  • invoke-xxxx/range:当方法的参数多于4个的时候使用
  • 在调用函数的时候通常会有返回结果,如果返回值非void,则需要使用
  • move-result (返回基本数据类型)和move-result-object (返回对象)
    • const-string v0, "Eric"
    • invoke-static {v0}, Lcmb/pbi;->t(Ljava/lang/String;)Ljava/lang/String;
    • move-result-object v2
    • v2就保存了t方法的返回值String类型的

最后

以上就是粗犷戒指为你收集整理的smali汇编语言学习总结的全部内容,希望文章能够帮你解决smali汇编语言学习总结所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(31)

评论列表共有 0 条评论

立即
投稿
返回
顶部