x86 Disassembly/Floating Point Examples

From Wikibooks, open books for an open world
Jump to: navigation, search

Example: Floating Point Arithmetic [edit]

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".