首页
社区
课程
招聘
反编译引擎有问题吗?关于cmpl-double和if-lez的困惑
2014-12-24 23:43 9037

反编译引擎有问题吗?关于cmpl-double和if-lez的困惑

2014-12-24 23:43
9037
首先两条指令解释如下
cmpl-double vBB,vBB,vCC;是比较两个双精度浮点数谁较小,如果vBB寄存器小于vCC寄存器,则结果为1,相等则结果为0,大于的话为结果为-1
if-lez vBB cond_0;如果vBB<=0则跳转到cond_0

我有个疑问
今天在看一个smali代码的时候遇到了cmpl-doulbe指令单独解释没有问题
而当cmpl-doulbe和if-lez 两条指令连用的时候意思就不同了
因为按照字面意思,程序的执行结果与事实不符;实例如下代码(遇到多处只列举其一):
.local v0, "levelNew":I
    iget-wide v1, p0, Lsk/bielyvlk/spectrumanalyzer/Band;->levelAnalog:D
    sget-wide v3, Lsk/bielyvlk/spectrumanalyzer/Band;->NOISE_LEVEL:D
    cmpl-double v1, v1, v3
    if-lez v1, :cond_0
    .line 68
    const-wide v1, 0x40d3880000000000L
    iget-wide v3, p0, Lsk/bielyvlk/spectrumanalyzer/Band;->levelAnalog:D
    sget-wide v5, Lsk/bielyvlk/spectrumanalyzer/Band;->NOISE_LEVEL:D
    sub-double/2addr v3, v5
    invoke-static {v3, v4}, Ljava/lang/Math;->log10(D)D
    move-result-wide v3
    mul-double/2addr v1, v3
    double-to-int v0, v1
    .line 69
    if-gez v0, :cond_0
    .line 70
    const/4 v0, 0x0
    .line 73
    :cond_0
    ......
按照字面意思解释的话还原代码如下
if (this.levelAnalog < this.NOISE_LEVEL) {
v1 = 20000.0D;
v3 = Math.log10(this.levelAnalog-this.NOISE_LEVEL);//这时this.levelAnalog-this.NOISE_LEVEL无意义因为公式LOG(N),要求N>0
v1 = v1 * v3;
v0 = (int)v1;
if (v0<0) {
        v0 = 0;
    }
}
所以smali指令
1.cmpl-double v2, v0, v2
2.if-lez v2, :cond_0
连用的意思可能是v0<=v2时跳转到cond_0
这样解释虽然与指令介绍不符但是,逻辑却合理,莫非反编译引擎有问题?

阿里云助力开发者!2核2G 3M带宽不限流量!6.18限时价,开 发者可享99元/年,续费同价!

收藏
点赞0
打赏
分享
最新回复 (3)
雪    币: 29
活跃值: (499)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
万抽抽 2 2014-12-25 00:36
2
0
楼主,你忽略了一点,对于doubel类型的数据,dalvik是使用连续的两个寄存器表示的。
cmpl-double v2, v0, v2 比较的是 [v0:v1] 与[v2:v3]。
同理invoke-static {v3, v4}, Ljava/lang/Math;->log10(D)D
是Math.log10(this.levelAnalog)而不是 Math.log10(this.levelAnalog-this.NOISE_LEVEL)
雪    币: 269
活跃值: (906)
能力值: ( LV12,RANK:345 )
在线值:
发帖
回帖
粉丝
AJISky 7 2014-12-25 11:23
3
0
兄弟你说的没错cmpl-double v2,v0,v2比较
但是你说的同理就不对了,你看下代码
iget-wide v3, p0, Lsk/bielyvlk/spectrumanalyzer/Band;->levelAnalog:D
sget-wide v5, Lsk/bielyvlk/spectrumanalyzer/Band;->NOISE_LEVEL:D
sub-double/2addr v3, v5
invoke-static {v3, v4}, Ljava/lang/Math;->log10(D)D
v3:v4=this.levelAnalog
v5:v6=this.NOISE_LEVEL
v3:v4=this.levelAnalog-this.NOISE_LEVEL
Math.log10(v3:v4)即为Math.log10(this.levelAnalog-this.NOISE_LEVEL)
雪    币: 29
活跃值: (499)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
万抽抽 2 2014-12-25 17:01
4
0
对的,是我没注意到。
游客
登录 | 注册 方可回帖
返回