PDF Archive

Easily share your PDF documents with your contacts, on the Web and Social Networks.

Share a file Manage my documents Convert Recover PDF Search Help Contact



REVERSE ENGINEERING FOR BEGINNERS .pdf



Original filename: REVERSE ENGINEERING FOR BEGINNERS.pdf
Author: rysiu

This PDF 1.3 document has been generated by Microsoft® Word 2010 / http://www.convertapi.com, and has been sent on pdf-archive.com on 13/02/2017 at 17:52, from IP address 27.147.x.x. The current document download page has been viewed 554 times.
File size: 39.1 MB (652 pages).
Privacy: public file




Download original PDF file









Document preview


Dear Readers,
Thanks to co-operation with Mr. Dennis
Yurichev we are able to give you the 23th
release of Hack Insight Mag that will
introduce to you a wide topic, that is Reverse
Engineering.
Mr. Yurichev (www.yurichev.com) is an
experienced
Reverse
Engineer
and
Programmer. Thanks to his great book you
will be able to understand the process of
discovering the technological principles of
a device, objec, or system through analysis of
its structure, function and operation.
As it turns out, (technical) writing takes a lot
of effort and work. This book is free and
available in source code form 17 (LaTeX), and
it will be so forever.
If you want us to continue publishing on all
these topics you may consider donation for
the author's work and subscribing to Hack
Insight Mag.
In this book you will find more than 600
pages. There are ≈ 300 TEX-files, ≈ 90 C/C++
source codes, ≈ 350 various listings. Keep in
mind that the price of books on the same topic
varies between $25 and $50.

[Hack]in(Sight)
Editorial Section:
Authors:
Dennis Yurichev
<dennis@yurichev.com>
Copy-editors:
Kevin McIntyre, Robrecht
Minten, Zsolt Nemeth, Phil
Quinan, Larry Pool, David
Sanborn (Axiom), Andy
Stern, Griffin Reid.
DTP:
Jim Steele
www.cyexdesign.com
Publisher:
Hack Insight Press Paweł
Płocki
www.hackinsight.org
Editor in Chief:
Paweł Płocki
p.pawel@hackinsight.org

Ways to donate are available on this page.
Ways to subscribe to Hack Insight are
available here.
We hope you will enjoy the hacking with this
release and you will share it with your
colleagues and friends.
Hack Insight Team

All trademarks presented in the
magazine were used only for
informative purposes.

Find out more technical
publications in Hack Insight
annual Subscription!
Subscribe to Hack Insight and stay update with advanced hacking and security
techniques. Our single subscription costs $174 and includes:
--> 24 unique publications per one year.
--> Access to all the previous releases from the first HiS issue.
--> 2 Special issues concerning "Best of Hack Insight" in each year.

Hack Insight Subscription is prepared for IT Security professionals, enthusiasts, engineers,
managers and geeks who are willing to improve advanced technical knowledge thanks to
our articles written by world class experts.

Our subscription covers many different topics, like: Network Scanning, Malware, Cloud
Security, DDoS, Hacking ID/Passwords, Mobile and Cyber Security, Reverse Engineering,
WiFi Vulnerabilities and much more.

You can obviously download and read a few examples from our free content bookmark:
Read Hack Insight Free Content

CONTENTS

SHORT CONTENTS

Short contents
I

Code patterns

II

1

Important fundamentals

312

III

Finding important/interesting stu_ in the code

315

IV

OS-specific

336

V

Tools

389

VI

More examples

395

VII

Other things

493

VIII
IX

Books/blogs worth reading

511

Exercises

515

A_erword

568

Appendix

570

Acronyms used

604

ii

CONTENTS

CONTENTS

Contents
0.1

Preface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

xv

I

Code patterns

1

1

Short introduction to the CPU

3

2

Hello, world!
2.1 x86 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.1.1
MSVC—x86 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.1.2 GCC—x86 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.1.3 GCC: AT&T syntax . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.2 x86-64 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.2.1 MSVC—x86-64 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.2.2 GCC—x86-64 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.3 ARM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.3.1 Non-optimizing Keil + ARM mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.3.2 Non-optimizing Keil: thumb mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.3.3 Optimizing Xcode (LLVM) + ARM mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.3.4 Optimizing Xcode (LLVM) + thumb-2 mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

4
4
4
5
6
7
7
8
9
9
10
11
11

3

Function prologue and epilogue
3.1 Recursion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

13
13

4 Stack
4.1 Why does the stack grow backward? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.2 What is the stack used for? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.2.1 Save the return address where a function must return control a_er execution . . . . . . . . . . . . . .
4.2.2 Passing function arguments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.2.3 Local variable storage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.2.4 x86: alloca() function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.2.5 (Windows) SEH . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.2.6 Bu_er overflow protection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.3 Typical stack layout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

14
14
15
15
16
17
17
19
19
19

5

printf() with several arguments
20
5.1 x86: 3 arguments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
5.1.1
MSVC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
5.1.2 MSVC and OllyDbg . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
21
5.1.3 GCC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
5.1.4 GCC and GDB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
5.2 x64: 8 arguments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
27
5.2.1 MSVC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
27
5.2.2 GCC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
5.2.3 GCC + GDB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
5.3 ARM: 3 arguments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
5.3.1 Non-optimizing Keil + ARM mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
5.3.2 Optimizing Keil + ARM mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
5.3.3 Optimizing Keil + thumb mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
5.4 ARM: 8 arguments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
31
5.4.1 Optimizing Keil: ARM mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
31
iii

5.5

5.4.2 Optimizing Keil: thumb mode . . . . . . .
5.4.3 Optimizing Xcode (LLVM): ARM mode . .
5.4.4 Optimizing Xcode (LLVM): thumb-2 mode
By the way . . . . . . . . . . . . . . . . . . . . . . .

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

CONTENTS
. . . 32
. . . 33
. . . 33
. . . 34

6 scanf()
35
6.1 About pointers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
6.2 x86 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
6.2.1 MSVC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
6.2.2 MSVC + OllyDbg . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
37
6.2.3 GCC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
6.3 x64 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
6.3.1 MSVC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
6.3.2 GCC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
6.4 ARM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
6.4.1 Optimizing Keil + thumb mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
6.5 Global variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
6.5.1 MSVC: x86 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
6.5.2 MSVC: x86 + OllyDbg . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
6.5.3 GCC: x86 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
6.5.4 MSVC: x64 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
6.5.5 ARM: Optimizing Keil + thumb mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
6.6 scanf() result checking . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
6.6.1 MSVC: x86 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
6.6.2 MSVC: x86: IDA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
6.6.3 MSVC: x86 + OllyDbg . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
6.6.4 MSVC: x86 + Hiew . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
6.6.5 GCC: x86 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
6.6.6 MSVC: x64 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
6.6.7 ARM: Optimizing Keil + thumb mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
7

Accessing passed arguments
7.1 x86 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7.1.1
MSVC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7.1.2
MSVC + OllyDbg . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7.1.3
GCC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7.2 x64 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7.2.1
MSVC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7.2.2 GCC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7.2.3 GCC: uint64_t instead int . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7.3 ARM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7.3.1
Non-optimizing Keil + ARM mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7.3.2 Optimizing Keil + ARM mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7.3.3 Optimizing Keil + thumb mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

54
54
54
55
55
56
56
58
59
59
59
60
60

8

One more word about results returning.

61

9 Pointers
64
9.1 Global variables example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
9.2 Local variables example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
9.3 Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
10 Conditional jumps
10.1 x86 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
10.1.1 x86 + MSVC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
10.1.2 x86 + MSVC + OllyDbg . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
10.1.3 x86 + MSVC + Hiew . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
10.1.4 Non-optimizing GCC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
10.1.5 Optimizing GCC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
10.2 ARM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
10.2.1 Optimizing Keil + ARM mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
10.2.2 Optimizing Keil + thumb mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
iv

70
70
70
72
74
76
76
77
77
78

11 switch()/case/default
11.1 Few number of cases . . . . . . . . . . . . .
11.1.1 x86 . . . . . . . . . . . . . . . . . . .
11.1.2 ARM: Optimizing Keil + ARM mode .
11.1.3 ARM: Optimizing Keil + thumb mode
11.2 A lot of cases . . . . . . . . . . . . . . . . . .
11.2.1 x86 . . . . . . . . . . . . . . . . . . .
11.2.2 ARM: Optimizing Keil + ARM mode .
11.2.3 ARM: Optimizing Keil + thumb mode

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.

CONTENTS
80
. . . . . . . . . . . . . . . . . 80
. . . . . . . . . . . . . . . . . 80
. . . . . . . . . . . . . . . . . 82
. . . . . . . . . . . . . . . . . 82
. . . . . . . . . . . . . . . . . 83
. . . . . . . . . . . . . . . . . 83
. . . . . . . . . . . . . . . . . 86
. . . . . . . . . . . . . . . . . 87

12 Loops
12.1 x86 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
12.1.1 OllyDbg . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
12.1.2 tracer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
12.2 ARM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
12.2.1 Non-optimizing Keil + ARM mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
12.2.2 Optimizing Keil + thumb mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
12.2.3 Optimizing Xcode (LLVM) + thumb-2 mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
12.3 One more thing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

89
89
92
93
95
95
95
95
96

13 strlen()
13.1 x86 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
13.1.1 Non-optimizing MSVC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
13.1.2 Non-optimizing GCC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
13.1.3 Optimizing MSVC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
13.1.4 Optimizing MSVC + OllyDbg . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
13.1.5 Optimizing GCC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
13.2 ARM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
13.2.1 Non-optimizing Xcode (LLVM) + ARM mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
13.2.2 Optimizing Xcode (LLVM) + thumb mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
13.2.3 Optimizing Keil + ARM mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

97
97
97
98
99
99
101
102
102
103
103

14 Division by 9
14.1 x86 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
14.2 ARM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
14.2.1 Optimizing Xcode (LLVM) + ARM mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
14.2.2 Optimizing Xcode (LLVM) + thumb-2 mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
14.2.3 Non-optimizing Xcode (LLVM) and Keil . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
14.3 How it works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
14.4 Getting divisor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
14.4.1 Variant #1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
14.4.2 Variant #2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

105
105
106
106
107
107
107
108
108
109

15 Working with FPU
15.1 Simple example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
15.1.1 x86 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
15.1.2 ARM: Optimizing Xcode (LLVM) + ARM mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
15.1.3 ARM: Optimizing Keil + thumb mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
15.2 Passing floating point number via arguments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
15.2.1 x86 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
15.2.2 ARM + Non-optimizing Xcode (LLVM) + thumb-2 mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
15.2.3 ARM + Non-optimizing Keil + ARM mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
15.3 Comparison example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
15.3.1 x86 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
15.3.2 Now let’s compile it with MSVC 2010 with optimization option/Ox . . . . . . . . . . . . . . . . . . . . .
15.3.3 GCC 4.4.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
15.3.4 GCC 4.4.1 with -O3 optimization turned on . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
15.3.5 ARM + Optimizing Xcode (LLVM) + ARM mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
15.3.6 ARM + Optimizing Xcode (LLVM) + thumb-2 mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
15.3.7 ARM + Non-optimizing Xcode (LLVM) + ARM mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
15.3.8 ARM + Optimizing Keil + thumb mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
15.4 x64 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

110
110
111
112
113
114
114
115
115
116
116
117
118
119
120
120
122
122
123

v


Related documents


reverse engineering for beginners
lab3prep
hitech ocean
learn exactly how basketball hand1325
cs1371 2016 fall syllabus
senior living ehr solution


Related keywords