smali语法之const/height16及十六进制转换float
(2013-06-20 14:33:46)
前两天简单学了些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
赠金笔
加载中,请稍候......