跳转到内容

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”。

华夏公益教科书