x86 Disassembly/Floating Point Examples
From Wikibooks, the open-content textbooks collection
[edit] Example: Floating Point Arithmetic
Here is the C source code, and the GCC assembly listing of a simple C language function that performs simple floating-point arithmetic. Can you determine what the numerical values of LC5 and LC6 are?
__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
For this, we don't even need a floating-point number calculator, although you are free to use one if you wish (and if you can find a good one). LC5 is added to [ebp - 16], which we know to be y, and LC6 is added to [ebp - 24], which we know to be z. Therefore, LC5 is the number "2.0", and LC6 is the number "3.0". Notice that the fld1 instruction automatically loads the top of the floating-point stack with the constant value "1.0".