Reverse Engineering for Beginners

(avery) #1

CHAPTER 17. FLOATING-POINT UNIT CHAPTER 17. FLOATING-POINT UNIT


Thefloattype requires the same number of bits as theinttype in 32-bit environments, but the number representation is
completely different.


17.5 Simple example


Let’s consider this simple example:


#include <stdio.h>


double f (double a, double b)
{
return a/3.14 + b*4.1;
};


int main()
{
printf ("%f\n", f(1.2, 3.4));
};


17.5.1 x86


MSVC


Compile it in MSVC 2010:


Listing 17.1: MSVC 2010:f()

CONST SEGMENT
real@4010666666666666 DQ 04010666666666666r ; 4.1
CONST ENDS
CONST SEGMENT
real@40091eb851eb851f DQ 040091eb851eb851fr ; 3.14
CONST ENDS
_TEXT SEGMENT
_a$ = 8 ; size = 8
_b$ = 16 ; size = 8
_f PROC
push ebp
mov ebp, esp
fld QWORD PTR _a$[ebp]


; current stack state: ST(0) = _a


fdiv QWORD PTR __real@40091eb851eb851f

; current stack state: ST(0) = result of _a divided by 3.14


fld QWORD PTR _b$[ebp]

; current stack state: ST(0) = _b; ST(1) = result of _a divided by 3.14


fmul QWORD PTR __real@4010666666666666

; current stack state:
; ST(0) = result of _b * 4.1;
; ST(1) = result of _a divided by 3.14


faddp ST(1), ST(0)

; current stack state: ST(0) = result of addition


pop ebp
ret 0
_f ENDP

Free download pdf