首先两条指令解释如下
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
这样解释虽然与指令介绍不符但是,逻辑却合理,莫非反编译引擎有问题?
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!