对数和指数,这段汇编代码是做什么的?
logarithm and exponential, What does this assembly code do?
以下汇编代码的结果是什么?
fld qword ptr [address2]
fld qword ptr [address1]
fldl2e
fmulp ST(1),ST
fld ST(0)
frndint
fxch ST(1)
fsub ST,ST(1)
f2xm1
fld1
faddp ST(1),ST
fscale
在这里,我不明白这段代码是做什么的。我的解读如下:
value[address2]^(2^(value[address1]*log2(e)-roundf(value[address1]*log2(e))))
这没有意义。有人可以纠正我吗?
下次请 post 您尝试在反汇编旁边发表评论。花很长时间把所有东西都打出来,看看我是否和你在同一个地方。另外,还有一个完整的 stackexchange for reverse engineering. 我通常不看,但是那里有一些很好的 x86 专家。
假设 v1 = contents of addr1
和 v2 = ... [addr2]
。
fld qword ptr [address2] ; st(0) = v2
fld qword ptr [address1] ; st(0) = v1, st(1) = v2
fldl2e ; st0 = l2e = log_2(e); st1=v1 st2=v2
fmulp ST(1),ST ; st0 = v1*l2e; st2=v2
fld ST(0) ; st0 = v1*l2e; st1=v1*l2e st2=v2
frndint ; st0 = round(v1*l2e); st1=v1*l2e st2=v2
fxch ST(1) ; st0 = v1*l2e; st1=round(v1*l2e) st2=v2
; careful here, this is fsub, NOT fsubp
fsub ST,ST(1) ; st0 = v1*l2e - round(v1*l2e) = fractional part of v1*l2e = v1l2efrac; st1=round(v1*l2e) st2=v2
f2xm1 ; st0 = 2^(v1l2efrac)-1; st1=round(v1*l2e) st2=v2
fld1 ; st0 = 1.0; st1 = 2^(v1l2efrac)-1 st2=round(v1*l2e) st3=v2
faddp ST(1),ST ; st0 = 1.0 + 2^(v1l2efrac)-1 = 2^v1l2efrac; st1=round(v1*l2e) st2=v2
; st0 = 2^v1l2efrac; st1=round(v1*l2e); st2=v2
fscale ; st0 = 2^v1l2efrac * 2^round(v1*l2e); st1=round(v1*l2e) st2=v2
; st0 = 2^(v1l2efrac + round(v1*l2e)); st1=round(v1*l2e) st2=v2
; simplify: fractional part + integer part = whole
; st0 = 2^(v1*l2e); st1=round(v1*l2e) st2=v2
; simplify: x^y = 2^(y * log2(x))
; st0 = e^v1; st1=round(v1*l2e) st2=v2
所以最后,st(0) = e^[address1]
,还有 2 个其他值仍在 FP 堆栈中。 (FP 堆栈其余部分的内容及其深度是您在分析中遗漏的一个重要问题。FP 堆栈推送和弹出必须平衡(除了在 [ 中留下 return 值=14=]), 这样可以检查您是否正确跟踪了一段代码。)
AFAICT,v2 在此结束时留在 FP 堆栈中,未在计算中使用。看起来你的追踪中有 2 个额外的流行音乐。
以下汇编代码的结果是什么?
fld qword ptr [address2]
fld qword ptr [address1]
fldl2e
fmulp ST(1),ST
fld ST(0)
frndint
fxch ST(1)
fsub ST,ST(1)
f2xm1
fld1
faddp ST(1),ST
fscale
在这里,我不明白这段代码是做什么的。我的解读如下:
value[address2]^(2^(value[address1]*log2(e)-roundf(value[address1]*log2(e))))
这没有意义。有人可以纠正我吗?
下次请 post 您尝试在反汇编旁边发表评论。花很长时间把所有东西都打出来,看看我是否和你在同一个地方。另外,还有一个完整的 stackexchange for reverse engineering. 我通常不看,但是那里有一些很好的 x86 专家。
假设 v1 = contents of addr1
和 v2 = ... [addr2]
。
fld qword ptr [address2] ; st(0) = v2
fld qword ptr [address1] ; st(0) = v1, st(1) = v2
fldl2e ; st0 = l2e = log_2(e); st1=v1 st2=v2
fmulp ST(1),ST ; st0 = v1*l2e; st2=v2
fld ST(0) ; st0 = v1*l2e; st1=v1*l2e st2=v2
frndint ; st0 = round(v1*l2e); st1=v1*l2e st2=v2
fxch ST(1) ; st0 = v1*l2e; st1=round(v1*l2e) st2=v2
; careful here, this is fsub, NOT fsubp
fsub ST,ST(1) ; st0 = v1*l2e - round(v1*l2e) = fractional part of v1*l2e = v1l2efrac; st1=round(v1*l2e) st2=v2
f2xm1 ; st0 = 2^(v1l2efrac)-1; st1=round(v1*l2e) st2=v2
fld1 ; st0 = 1.0; st1 = 2^(v1l2efrac)-1 st2=round(v1*l2e) st3=v2
faddp ST(1),ST ; st0 = 1.0 + 2^(v1l2efrac)-1 = 2^v1l2efrac; st1=round(v1*l2e) st2=v2
; st0 = 2^v1l2efrac; st1=round(v1*l2e); st2=v2
fscale ; st0 = 2^v1l2efrac * 2^round(v1*l2e); st1=round(v1*l2e) st2=v2
; st0 = 2^(v1l2efrac + round(v1*l2e)); st1=round(v1*l2e) st2=v2
; simplify: fractional part + integer part = whole
; st0 = 2^(v1*l2e); st1=round(v1*l2e) st2=v2
; simplify: x^y = 2^(y * log2(x))
; st0 = e^v1; st1=round(v1*l2e) st2=v2
所以最后,st(0) = e^[address1]
,还有 2 个其他值仍在 FP 堆栈中。 (FP 堆栈其余部分的内容及其深度是您在分析中遗漏的一个重要问题。FP 堆栈推送和弹出必须平衡(除了在 [ 中留下 return 值=14=]), 这样可以检查您是否正确跟踪了一段代码。)
AFAICT,v2 在此结束时留在 FP 堆栈中,未在计算中使用。看起来你的追踪中有 2 个额外的流行音乐。