x86 反汇编/浮点示例
外观
< X86 反汇编
以下是 C 源代码,以及一个简单 C 语言函数的 GCC 汇编列表,该函数执行简单的浮点运算。你能确定 LC5 和 LC6 的数值吗?
__fastcall double MyFunction2(double x, double y, float z)
{
return (x + 1.0) * (y + 2.0) * (z + 3.0);
}
.align 8
LC5:
.long 0
.long 1073741824
.align 8
LC6:
.long 0
.long 1074266112
.globl @MyFunction2@20
.def @MyFunction2@20; .scl 2; .type 32; .endef
@MyFunction2@20:
pushl %ebp
movl %esp, %ebp
subl $16, %esp
fldl 8(%ebp)
fstpl -8(%ebp)
fldl 16(%ebp)
fstpl -16(%ebp)
fldl -8(%ebp)
fld1
faddp %st, %st(1)
fldl -16(%ebp)
fldl LC5
faddp %st, %st(1)
fmulp %st, %st(1)
flds 24(%ebp)
fldl LC6
faddp %st, %st(1)
fmulp %st, %st(1)
leave
ret $20
为此,我们甚至不需要浮点数计算器,尽管如果你愿意(并且如果你能找到一个好的计算器),你可以随意使用它。LC5 被加到 [ebp - 16],我们知道它是 y,LC6 被加到 [ebp - 24],我们知道它是 z。因此,LC5 是数字“2.0”,LC6 是数字“3.0”。请注意,fld1 指令会自动将浮点堆栈的顶部加载为常数值“1.0”。