加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

smali语法之const/height16及十六进制转换float

(2013-06-20 14:33:46)
标签:

android

smali

float

const/height16

it

分类: java和android
    前两天简单学了些smali语法,这两天在分析个程序,功能上一直出现问题。由于程序比较乱,排查了很久,最终也找到了问题所在。一个很简单的数值问题阻拦了我这么久,也充分暴露了我基础太不扎实了。
    const语句其实就是赋值。const v1 0x0  把0x0赋给v1寄存器。而const/height16不是单纯的赋值,需要将值右边零扩展为32位在赋给寄存器,如:
    const/height16 v1 0x4120
    其实是将0x41200000赋给v1.
    再下来就是float转换,比如有这样两句:
    const/height16 v2 0x4120
    invoke-interface {v0, v2}, Lcom/test;->getFloat(F)
    那么getFloat方法的参数值到底是多少?这里就需要对v2寄存器的十六进制数值进行转换为float.首先将十六进制转换为二进制:
    0 10000010 01000000 00000000 0000000
    其中,第一位为符号位,再八位为阶码,后23位是尾数。先计算阶码,10000010十进制为130,减去127(偏移)为3;再计算尾数,首先在尾数左端添“1.”,这样就是1.01000000 00000000 0000000,阶码为3,小数点右移3位,最终为1010.00000 00000000 0000000。
    最后将1010.00000 00000000 0000000转换为十进制为10.0。这样参数值实际就是10.0
   
    const指令还有很多种形式,扩展也不尽相同。今后遇到一定要小心啊!!

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有