smali 变量

基础

Android 的变量都存储于寄存器中。变量分为 v 与 p 两种格式

  1. v 变量表示方法中非参数变量。

  2. p 变量表示方法中参数变量。

    • 如果方法是非静态方法,p0 表示 this

    • 如果方法是静态方法,p0 表示第一个参数。

  3. 寄存器都是 32 位。因此, double 与 long 类型的变量会占据两个寄存器,它们在存储时会使用两个连续的寄存器。

    private void test(int x){
        long a = 10000L;
        int b = 2;
    }
    

    该方法需要的 5 个寄存器。参数需要两个,变量 b 需要一个,变量 a 需要两个。

    变量 a 会使用 v0 和 v1 两个寄存器。变量 b 使用 v2 。

  4. boolean 类型的变量会被存储成 0 或 1 。其中 1 表示真,0 表示假。

表示

Lcom/demo/adapter/MainActivity;->test:Ljava/lang/String;

表示 MainActivity 类中的 String 类型的 test 变量。

类型

.registers : 声明在方法第一行,表示该方法使用到的寄存器的个数

.param : 表示该变量为参数变量

.local : 表示方法中非参数的变量

.field : 全局变量


赋值

  1. const-class vx,type_id : Class 对象赋值。 将 type_id 对应的类的 Class 对象赋值给 vx。

  2. const-string vx,string_id: 字符串赋值。将 string_id 指向的字符串赋值给 vx。

    • string_id 也可以直接替换成具体的 String。此时表示将 String 赋值给 vx。

    • 除 const-string 外,还有 const-string/jumbo,它与 const-string 一样,只不过它支持的字符串引用数更大

数字赋值

赋值时,命令有 const 与 const-wide 两种。其中 const 表示该变量为 32 位,const-wide 表示该变量为 64 位。

整数赋值

  1. const/4 vx,lit4 : 将 4 位的常量赋值给 vx。也就是说 vx 的最大值是 15。

  2. const/16 vx,lit16:将 16 位的常量赋值给 vx

    • const-wide/16 vx, lit16 表示将一个 16 位的常量存储到 vx 与 vx+1 两个寄存器中 —— 即一个 long 类型的数据。
  3. const vx, lit32:将 32 位的常量赋值给 vx

    • const-wide/32 vx, lit32 表示将一个 32 位的常量存储到 vx 与 vx+1 两个寄存器中 —— 即一个 long 类型的数据。
  4. const-wide vx, lit64 : 将一个 64 位的数据存储到 vx 与 vx+1 两个寄存器中

  5. / 后的数值表示数值本身是多少位,由 const 与 const-wide 区分变量占多少位。

有些命令中,数值本身位数较低,而寄存器的位数较高。因此将数值填充到寄存器时,需要对数值进行扩展,该过程所进行的扩展都是 符号扩展 —— 根据原始数值的符号位决定对数值的高位补 0 还是补 1(如果数值为负数,则高位补 1 ;如果为正数,则高位补 0)

浮点数

参考官方链接

  1. const/high16 v0, lit16:将给定的 16 位常量(右零扩展为 32 位)移到指定的寄存器中

  2. const-wide/high16 vx,lit16:将 16 位常量右零扩展为 64 位后填充到 vx 和 vx + 1 寄存器中。 用于初始化双精度值

  3. 对于 float 数值,除第一个命令外,还使用 const vx,lit32 形式进行赋值。因为 float 是 32 位。

  4. 对于 double ,除第二个命令外,还可以使用 const-wide vx,lit64 形式进行赋值。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容