X86 Assembly - cs.tau.ac.il
Transcript of X86 Assembly - cs.tau.ac.il
![Page 1: X86 Assembly - cs.tau.ac.il](https://reader031.fdocuments.us/reader031/viewer/2022020622/61ec44e2b1ab7526193cbc6c/html5/thumbnails/1.jpg)
X86 Assembly
Mooly Sagiv
http://www.egr.unlv.edu/~ed/assembly64.pdf
https://godbolt.org/
https://www.cis.upenn.edu/~stevez/ CS341
![Page 2: X86 Assembly - cs.tau.ac.il](https://reader031.fdocuments.us/reader031/viewer/2022020622/61ec44e2b1ab7526193cbc6c/html5/thumbnails/2.jpg)
Compiler Phases
2
Program
text
Parser AST
Syntax errors
Semantic
Analysis
Annotated
AST
Semantic errors
IR Optimizer IRCode
Generationassembly
Code Generation
![Page 3: X86 Assembly - cs.tau.ac.il](https://reader031.fdocuments.us/reader031/viewer/2022020622/61ec44e2b1ab7526193cbc6c/html5/thumbnails/3.jpg)
Outline
• X86 history
• Memory hierarchy
• Stack frames
• Compiling a simple example
• Running a simple example
![Page 4: X86 Assembly - cs.tau.ac.il](https://reader031.fdocuments.us/reader031/viewer/2022020622/61ec44e2b1ab7526193cbc6c/html5/thumbnails/4.jpg)
Intel’s X86 Architecture
![Page 5: X86 Assembly - cs.tau.ac.il](https://reader031.fdocuments.us/reader031/viewer/2022020622/61ec44e2b1ab7526193cbc6c/html5/thumbnails/5.jpg)
X86 historyYear Invention
1978 Intel introduces 8086
1982 80186, 80286
1985 80386
1989 80486 (100MHz, 1μm)
1993 Pentium
1995 Pentium Pro
1997 Pentium II/III
2003 Pentium M(Banias), Intel Core
2006 Intel Core 2
2008 Intel Core i3/i5/i7
2011 SandyBridge / IvyBridge
2013 Haswell
2014 Broadwell
2015 Skylake (core i3/i5/i7/i9) (2.4GHz, 14nm)
2016 Xeon Phi
![Page 6: X86 Assembly - cs.tau.ac.il](https://reader031.fdocuments.us/reader031/viewer/2022020622/61ec44e2b1ab7526193cbc6c/html5/thumbnails/6.jpg)
![Page 7: X86 Assembly - cs.tau.ac.il](https://reader031.fdocuments.us/reader031/viewer/2022020622/61ec44e2b1ab7526193cbc6c/html5/thumbnails/7.jpg)
Memory vs. CPU Speed
![Page 8: X86 Assembly - cs.tau.ac.il](https://reader031.fdocuments.us/reader031/viewer/2022020622/61ec44e2b1ab7526193cbc6c/html5/thumbnails/8.jpg)
Solutions
• Architecture & Compiler• Machine registers utilized by compiler
• Explore locality
![Page 9: X86 Assembly - cs.tau.ac.il](https://reader031.fdocuments.us/reader031/viewer/2022020622/61ec44e2b1ab7526193cbc6c/html5/thumbnails/9.jpg)
Memory Hierarchy
Registers
Cache
1.Smaller2. Faster3. More expensive
RAM
Secondary Storage(disk drive, SSID)
Tertiary Storage(Remote storage, optical)
![Page 10: X86 Assembly - cs.tau.ac.il](https://reader031.fdocuments.us/reader031/viewer/2022020622/61ec44e2b1ab7526193cbc6c/html5/thumbnails/10.jpg)
Stack Frames
• Allocate a separate space for every procedure incarnation
• Relative addresses
• Provide a simple mean to achieve modularity
• Supports separate code generation of procedures
• Naturally supports recursion
• Efficient memory allocation policy• Low overhead
• Hardware support may be available
• LIFO policy
• Not a pure stack• Non local references
• Updated using arithmetic10
![Page 11: X86 Assembly - cs.tau.ac.il](https://reader031.fdocuments.us/reader031/viewer/2022020622/61ec44e2b1ab7526193cbc6c/html5/thumbnails/11.jpg)
![Page 12: X86 Assembly - cs.tau.ac.il](https://reader031.fdocuments.us/reader031/viewer/2022020622/61ec44e2b1ab7526193cbc6c/html5/thumbnails/12.jpg)
A Typical Stack Frame
higher addressesprevious frame
current frame
lexical pointer
argument 1
argument 2
dynamic link
return address
temporaries
argument 2
argument 1
outgoing
parameters
lower addressesnext frame
frame size
frame pointer
stack pointer
outgoing
parameters
registers
locals
administrative
12
![Page 13: X86 Assembly - cs.tau.ac.il](https://reader031.fdocuments.us/reader031/viewer/2022020622/61ec44e2b1ab7526193cbc6c/html5/thumbnails/13.jpg)
lexical pointer
Pascal 80386 Frame
higher addresses
previous frame
current frame
lexical pointer
argument 2
argument 1
locals
return address
temporaries
argument 1
argument 2outgoing
parameters
saved registers
lower addresses
next frame
rbp
rsp
previous ebp
13
![Page 14: X86 Assembly - cs.tau.ac.il](https://reader031.fdocuments.us/reader031/viewer/2022020622/61ec44e2b1ab7526193cbc6c/html5/thumbnails/14.jpg)
Compiling a simple example
#include <stdio.h>main() {
printf("factorial(2)=%d", factorial(2));}
.LC0:.string "factorial(2)=%d"
main:push rbpmov rbp, rspmov edi, 2call factorial(int)mov esi, eaxmov edi, OFFSET FLAT:.LC0mov eax, 0call printfmov eax, 0pop rbpret
![Page 15: X86 Assembly - cs.tau.ac.il](https://reader031.fdocuments.us/reader031/viewer/2022020622/61ec44e2b1ab7526193cbc6c/html5/thumbnails/15.jpg)
Compiling factorial
int factorial(int num) {if (num == 1) return 1 ;else return num * factorial(num -1 );
}
. factorial(int):push rbpmov rbp, rspsub rsp, 16mov DWORD PTR [rbp-4], edicmp DWORD PTR [rbp-4], 1jne .L2mov eax, 1jmp .L3
.L2:mov eax, DWORD PTR [rbp-4]sub eax, 1mov edi, eaxcall factorial(int)imul eax, DWORD PTR [rbp-4]
.L3:leaveret
![Page 16: X86 Assembly - cs.tau.ac.il](https://reader031.fdocuments.us/reader031/viewer/2022020622/61ec44e2b1ab7526193cbc6c/html5/thumbnails/16.jpg)
factorial(int):…
.LC0:.string "factorial(2)=%d"
main:push rbpmov rbp, rspmov edi,2call factorial(int)mov esi, eaxmov edi, OFFSET FLAT:.LC0mov eax, 0call printfmov eax, 0pop rbpret
Code/DataStack
rbp
rsp
777777777
![Page 17: X86 Assembly - cs.tau.ac.il](https://reader031.fdocuments.us/reader031/viewer/2022020622/61ec44e2b1ab7526193cbc6c/html5/thumbnails/17.jpg)
factorial(int):…
.LC0:.string "factorial(2)=%d"
main:push rbpmov rbp, rspmov edi, 2call factorial(int)mov esi, eaxmov edi, OFFSET FLAT:.LC0mov eax, 0call printfmov eax, 0pop rbpret
Code/DataStack
rbp
rsp
777777777777777777
![Page 18: X86 Assembly - cs.tau.ac.il](https://reader031.fdocuments.us/reader031/viewer/2022020622/61ec44e2b1ab7526193cbc6c/html5/thumbnails/18.jpg)
factorial(int):…
.LC0:.string "factorial(2)=%d"
main:push rbpmov rbp, rspmov edi, 2call factorial(int)mov esi, eaxmov edi, OFFSET FLAT:.LC0mov eax, 0call printfmov eax, 0pop rbpret
Code/DataStack
rbp
rsp
777777777777777777
![Page 19: X86 Assembly - cs.tau.ac.il](https://reader031.fdocuments.us/reader031/viewer/2022020622/61ec44e2b1ab7526193cbc6c/html5/thumbnails/19.jpg)
factorial(int):…
.LC0:.string "factorial(2)=%d"
main:push rbpmov rbp, rspmov edi, 2call factorial(int)
L4: mov esi, eaxmov edi, OFFSET FLAT:.LC0mov eax, 0call printfmov eax, 0pop rbpret
Code/DataStack
rbp
rsp
777777777777777777
2
edi
![Page 20: X86 Assembly - cs.tau.ac.il](https://reader031.fdocuments.us/reader031/viewer/2022020622/61ec44e2b1ab7526193cbc6c/html5/thumbnails/20.jpg)
factorial(int):…
.LC0:.string "factorial(2)=%d"
main:push rbpmov rbp, rspmov edi, 2call factorial(int)
L2: mov esi, eaxmov edi, OFFSET FLAT:.LC0mov eax, 0call printfmov eax, 0pop rbpret
Code/DataStack
rbp
rsp
777777777777777777
2
edi
![Page 21: X86 Assembly - cs.tau.ac.il](https://reader031.fdocuments.us/reader031/viewer/2022020622/61ec44e2b1ab7526193cbc6c/html5/thumbnails/21.jpg)
factorial(int):push rbpmov rbp, rspsub rsp, 16mov DWORD PTR [rbp-4], edicmp DWORD PTR [rbp-4], 1jne .L2mov eax, 1jmp .L3
.L2:mov eax, DWORD PTR [rbp-4]sub eax, 1mov edi, eaxcall factorial(int)imul eax, DWORD PTR [rbp-4]
.L3:leaveret
…
Code/DataStack
rbp
rsp
777777777777777777
2
edi
L4
![Page 22: X86 Assembly - cs.tau.ac.il](https://reader031.fdocuments.us/reader031/viewer/2022020622/61ec44e2b1ab7526193cbc6c/html5/thumbnails/22.jpg)
factorial(int):push rbpmov rbp, rspsub rsp, 16mov DWORD PTR [rbp-4], edicmp DWORD PTR [rbp-4], 1jne .L2mov eax, 1jmp .L3
.L2:mov eax, DWORD PTR [rbp-4]sub eax, 1mov edi, eaxcall factorial(int)imul eax, DWORD PTR [rbp-4]
.L3:leaveret
…
Code/DataStack
rbp
rsp
777777777777777777
2
edi
L4777777777
![Page 23: X86 Assembly - cs.tau.ac.il](https://reader031.fdocuments.us/reader031/viewer/2022020622/61ec44e2b1ab7526193cbc6c/html5/thumbnails/23.jpg)
factorial(int):push rbpmov rbp, rspsub rsp, 16mov DWORD PTR [rbp-4], edicmp DWORD PTR [rbp-4], 1jne .L2mov eax, 1jmp .L3
.L2:mov eax, DWORD PTR [rbp-4]sub eax, 1mov edi, eaxcall factorial(int)imul eax, DWORD PTR [rbp-4]
.L3:leaveret
…
Code/DataStack
rbp
rsp
777777777777777777
2
edi
L4777777777777777756
![Page 24: X86 Assembly - cs.tau.ac.il](https://reader031.fdocuments.us/reader031/viewer/2022020622/61ec44e2b1ab7526193cbc6c/html5/thumbnails/24.jpg)
factorial(int):push rbpmov rbp, rspsub rsp, 16mov DWORD PTR [rbp-4], edicmp DWORD PTR [rbp-4], 1jne .L2mov eax, 1jmp .L3
.L2:mov eax, DWORD PTR [rbp-4]sub eax, 1mov edi, eaxcall factorial(int)imul eax, DWORD PTR [rbp-4]
.L3:leaveret
…
Code/DataStack
rbp
rsp
777777777777777777
2
edi
L4777777777777777756
777777740
![Page 25: X86 Assembly - cs.tau.ac.il](https://reader031.fdocuments.us/reader031/viewer/2022020622/61ec44e2b1ab7526193cbc6c/html5/thumbnails/25.jpg)
factorial(int):push rbpmov rbp, rspsub rsp, 16mov DWORD PTR [rbp-4], edicmp DWORD PTR [rbp-4], 1jne .L2mov eax, 1jmp .L3
.L2:mov eax, DWORD PTR [rbp-4]sub eax, 1mov edi, eaxcall factorial(int)imul eax, DWORD PTR [rbp-4]
.L3:leaveret
…
Code/DataStack
rbp
rsp
777777777777777777
2
edi
L4777777777777777756
7777777402
![Page 26: X86 Assembly - cs.tau.ac.il](https://reader031.fdocuments.us/reader031/viewer/2022020622/61ec44e2b1ab7526193cbc6c/html5/thumbnails/26.jpg)
factorial(int):push rbpmov rbp, rspsub rsp, 16mov DWORD PTR [rbp-4], edicmp DWORD PTR [rbp-4], 1jne .L2mov eax, 1jmp .L3
.L2:mov eax, DWORD PTR [rbp-4]sub eax, 1mov edi, eaxcall factorial(int)imul eax, DWORD PTR [rbp-4]
.L3:leaveret
…
Code/DataStack
rbp
rsp
777777777777777777
2
edi
L4777777777777777756
7777777402
cr
NE
![Page 27: X86 Assembly - cs.tau.ac.il](https://reader031.fdocuments.us/reader031/viewer/2022020622/61ec44e2b1ab7526193cbc6c/html5/thumbnails/27.jpg)
factorial(int):push rbpmov rbp, rspsub rsp, 16mov DWORD PTR [rbp-4], edicmp DWORD PTR [rbp-4], 1jne .L2mov eax, 1jmp .L3
.L2:mov eax, DWORD PTR [rbp-4]sub eax, 1mov edi, eaxcall factorial(int)imul eax, DWORD PTR [rbp-4]
.L3:leaveret
…
Code/DataStack
rbp
rsp
777777777777777777
2
edi
L4777777777777777756
7777777402
![Page 28: X86 Assembly - cs.tau.ac.il](https://reader031.fdocuments.us/reader031/viewer/2022020622/61ec44e2b1ab7526193cbc6c/html5/thumbnails/28.jpg)
factorial(int):push rbpmov rbp, rspsub rsp, 16mov DWORD PTR [rbp-4], edicmp DWORD PTR [rbp-4], 1jne .L2mov eax, 1jmp .L3
.L2:mov eax, DWORD PTR [rbp-4]sub eax, 1mov edi, eaxcall factorial(int)imul eax, DWORD PTR [rbp-4]
.L3:leaveret
…
Code/DataStack
rbp
rsp
777777777777777777
2
edi
L4777777777777777756
7777777402
2
eax
![Page 29: X86 Assembly - cs.tau.ac.il](https://reader031.fdocuments.us/reader031/viewer/2022020622/61ec44e2b1ab7526193cbc6c/html5/thumbnails/29.jpg)
factorial(int):push rbpmov rbp, rspsub rsp, 16mov DWORD PTR [rbp-4], edicmp DWORD PTR [rbp-4], 1jne .L2mov eax, 1jmp .L3
.L2:mov eax, DWORD PTR [rbp-4]sub eax, 1mov edi, eaxcall factorial(int)imul eax, DWORD PTR [rbp-4]
.L3:leaveret
…
Code/DataStack
rbp
rsp
777777777777777777
2
edi
L4777777777777777756
7777777402
1
eax
![Page 30: X86 Assembly - cs.tau.ac.il](https://reader031.fdocuments.us/reader031/viewer/2022020622/61ec44e2b1ab7526193cbc6c/html5/thumbnails/30.jpg)
factorial(int):push rbpmov rbp, rspsub rsp, 16mov DWORD PTR [rbp-4], edicmp DWORD PTR [rbp-4], 1jne .L2mov eax, 1jmp .L3
.L2:mov eax, DWORD PTR [rbp-4]sub eax, 1mov edi, eaxcall factorial(int)imul eax, DWORD PTR [rbp-4]
.L3:leaveret
…
Code/DataStack
rbp
rsp
777777777777777777
1
edi
L4777777777777777756
7777777402
1
eax
![Page 31: X86 Assembly - cs.tau.ac.il](https://reader031.fdocuments.us/reader031/viewer/2022020622/61ec44e2b1ab7526193cbc6c/html5/thumbnails/31.jpg)
factorial(int):push rbpmov rbp, rspsub rsp, 16mov DWORD PTR [rbp-4], edicmp DWORD PTR [rbp-4], 1jne .L2mov eax, 1jmp .L3
.L2:mov eax, DWORD PTR [rbp-4]sub eax, 1mov edi, eaxcall factorial(int)
L5: imul eax, DWORD PTR [rbp-4].L3:
leaveret
…
Code/DataStack
rbp
rsp
777777777777777777
1
edi
L4777777777777777756
7777777402
1
eax
L5
![Page 32: X86 Assembly - cs.tau.ac.il](https://reader031.fdocuments.us/reader031/viewer/2022020622/61ec44e2b1ab7526193cbc6c/html5/thumbnails/32.jpg)
factorial(int):push rbpmov rbp, rspsub rsp, 16mov DWORD PTR [rbp-4], edicmp DWORD PTR [rbp-4], 1jne .L2mov eax, 1jmp .L3
.L2:mov eax, DWORD PTR [rbp-4]sub eax, 1mov edi, eaxcall factorial(int)
L5: imul eax, DWORD PTR [rbp-4].L3:
leaveret
…
Code/DataStack
rbp
rsp
777777777777777777
1
edi
L4777777777777777756
7777777402
1
eax
L5
777777756
![Page 33: X86 Assembly - cs.tau.ac.il](https://reader031.fdocuments.us/reader031/viewer/2022020622/61ec44e2b1ab7526193cbc6c/html5/thumbnails/33.jpg)
factorial(int):push rbpmov rbp, rspsub rsp, 16mov DWORD PTR [rbp-4], edicmp DWORD PTR [rbp-4], 1jne .L2mov eax, 1jmp .L3
.L2:mov eax, DWORD PTR [rbp-4]sub eax, 1mov edi, eaxcall factorial(int)
L5: imul eax, DWORD PTR [rbp-4].L3:
leaveret
…
Code/DataStack
rbp
rsp
777777777777777777
2
edi
L4777777777777777756
7777777402
2
eax
L5
777777756
777777736
777777732
![Page 34: X86 Assembly - cs.tau.ac.il](https://reader031.fdocuments.us/reader031/viewer/2022020622/61ec44e2b1ab7526193cbc6c/html5/thumbnails/34.jpg)
factorial(int):push rbpmov rbp, rspsub rsp, 16mov DWORD PTR [rbp-4], edicmp DWORD PTR [rbp-4], 1jne .L2mov eax, 1jmp .L3
.L2:mov eax, DWORD PTR [rbp-4]sub eax, 1mov edi, eaxcall factorial(int)
L5: imul eax, DWORD PTR [rbp-4].L3:
leaveret
…
Code/DataStack
rbp
rsp
777777777777777777
1
edi
L4777777777777777756
7777777402
1
eax
L5
777777756
777777736
777777732
7777777161
![Page 35: X86 Assembly - cs.tau.ac.il](https://reader031.fdocuments.us/reader031/viewer/2022020622/61ec44e2b1ab7526193cbc6c/html5/thumbnails/35.jpg)
factorial(int):push rbpmov rbp, rspsub rsp, 16mov DWORD PTR [rbp-4], edicmp DWORD PTR [rbp-4], 1jne .L2mov eax, 1jmp .L3
.L2:mov eax, DWORD PTR [rbp-4]sub eax, 1mov edi, eaxcall factorial(int)
L5: imul eax, DWORD PTR [rbp-4].L3:
leaveret
…
Code/DataStack
rbp
rsp
777777777777777777
1
edi
L4777777777777777756
7777777402
1
eax
L5
777777756
777777736
777777732
7777777161
cr
E
![Page 36: X86 Assembly - cs.tau.ac.il](https://reader031.fdocuments.us/reader031/viewer/2022020622/61ec44e2b1ab7526193cbc6c/html5/thumbnails/36.jpg)
factorial(int):push rbpmov rbp, rspsub rsp, 16mov DWORD PTR [rbp-4], edicmp DWORD PTR [rbp-4], 1jne .L2mov eax, 1jmp .L3
.L2:mov eax, DWORD PTR [rbp-4]sub eax, 1mov edi, eaxcall factorial(int)
L5: imul eax, DWORD PTR [rbp-4].L3:
leaveret
…
Code/DataStack
rbp
rsp
777777777777777777
1
edi
L4777777777777777756
7777777402
1
eax
L5
777777756
777777736
777777732
7777777161
![Page 37: X86 Assembly - cs.tau.ac.il](https://reader031.fdocuments.us/reader031/viewer/2022020622/61ec44e2b1ab7526193cbc6c/html5/thumbnails/37.jpg)
factorial(int):push rbpmov rbp, rspsub rsp, 16mov DWORD PTR [rbp-4], edicmp DWORD PTR [rbp-4], 1jne .L2mov eax, 1jmp .L3
.L2:mov eax, DWORD PTR [rbp-4]sub eax, 1mov edi, eaxcall factorial(int)
L5: imul eax, DWORD PTR [rbp-4].L3:
leaveret
…
Code/DataStack
rbp
rsp
777777777777777777
1
edi
L4777777777777777756
7777777402
1
eax
L5
777777756
777777736
777777732
7777777161
![Page 38: X86 Assembly - cs.tau.ac.il](https://reader031.fdocuments.us/reader031/viewer/2022020622/61ec44e2b1ab7526193cbc6c/html5/thumbnails/38.jpg)
factorial(int):push rbpmov rbp, rspsub rsp, 16mov DWORD PTR [rbp-4], edicmp DWORD PTR [rbp-4], 1jne .L2mov eax, 1jmp .L3
.L2:mov eax, DWORD PTR [rbp-4]sub eax, 1mov edi, eaxcall factorial(int)
L5: imul eax, DWORD PTR [rbp-4].L3:
leaveret
…
Code/DataStack
rbp
rsp
777777777777777777
1
edi
L4777777777777777756
7777777402
1
eax
L5
777777756
777777736
777777732
7777777161
![Page 39: X86 Assembly - cs.tau.ac.il](https://reader031.fdocuments.us/reader031/viewer/2022020622/61ec44e2b1ab7526193cbc6c/html5/thumbnails/39.jpg)
factorial(int):push rbpmov rbp, rspsub rsp, 16mov DWORD PTR [rbp-4], edicmp DWORD PTR [rbp-4], 1jne .L2mov eax, 1jmp .L3
.L2:mov eax, DWORD PTR [rbp-4]sub eax, 1mov edi, eaxcall factorial(int)
L5: imul eax, DWORD PTR [rbp-4].L3:
leaveret
…
Code/DataStack
rbp
rsp
777777777777777777
1
edi
L4777777777777777756
7777777402
1
eax
L5
777777756
777777736
777777732
7777777161
![Page 40: X86 Assembly - cs.tau.ac.il](https://reader031.fdocuments.us/reader031/viewer/2022020622/61ec44e2b1ab7526193cbc6c/html5/thumbnails/40.jpg)
factorial(int):push rbpmov rbp, rspsub rsp, 16mov DWORD PTR [rbp-4], edicmp DWORD PTR [rbp-4], 1jne .L2mov eax, 1jmp .L3
.L2:mov eax, DWORD PTR [rbp-4]sub eax, 1mov edi, eaxcall factorial(int)
L5: imul eax, DWORD PTR [rbp-4].L3:
leaveret
…
Code/DataStack
rbp
rsp
777777777777777777
1
edi
L4777777777777777756
7777777402
1
eax
L5
777777756
777777736
777777732
7777777161
![Page 41: X86 Assembly - cs.tau.ac.il](https://reader031.fdocuments.us/reader031/viewer/2022020622/61ec44e2b1ab7526193cbc6c/html5/thumbnails/41.jpg)
factorial(int):push rbpmov rbp, rspsub rsp, 16mov DWORD PTR [rbp-4], edicmp DWORD PTR [rbp-4], 1jne .L2mov eax, 1jmp .L3
.L2:mov eax, DWORD PTR [rbp-4]sub eax, 1mov edi, eaxcall factorial(int)
L5: imul eax, DWORD PTR [rbp-4].L3:
leaveret
…
Code/DataStack
rbp
rsp
777777777777777777
1
edi
L4777777777777777756
7777777402
1
eax
777777756
777777736
777777732
7777777161
![Page 42: X86 Assembly - cs.tau.ac.il](https://reader031.fdocuments.us/reader031/viewer/2022020622/61ec44e2b1ab7526193cbc6c/html5/thumbnails/42.jpg)
factorial(int):push rbpmov rbp, rspsub rsp, 16mov DWORD PTR [rbp-4], edicmp DWORD PTR [rbp-4], 1jne .L2mov eax, 1jmp .L3
.L2:mov eax, DWORD PTR [rbp-4]sub eax, 1mov edi, eaxcall factorial(int)
L5: imul eax, DWORD PTR [rbp-4].L3:
leaveret
…
Code/DataStack
rbp
rsp
777777777777777777
1
edi
L4777777777777777756
7777777402
2
eax
777777756
777777736
777777732
7777777161
![Page 43: X86 Assembly - cs.tau.ac.il](https://reader031.fdocuments.us/reader031/viewer/2022020622/61ec44e2b1ab7526193cbc6c/html5/thumbnails/43.jpg)
factorial(int):push rbpmov rbp, rspsub rsp, 16mov DWORD PTR [rbp-4], edicmp DWORD PTR [rbp-4], 1jne .L2mov eax, 1jmp .L3
.L2:mov eax, DWORD PTR [rbp-4]sub eax, 1mov edi, eaxcall factorial(int)
L5: imul eax, DWORD PTR [rbp-4].L3:
leaveret
…
Code/DataStack
rbp
rsp
777777777777777777
1
edi
L4777777777777777756
7777777402
2
eax
777777756
777777736
777777732
7777777161
![Page 44: X86 Assembly - cs.tau.ac.il](https://reader031.fdocuments.us/reader031/viewer/2022020622/61ec44e2b1ab7526193cbc6c/html5/thumbnails/44.jpg)
factorial(int):…
.LC0:.string "factorial(3)=%d"
main:push rbpmov rbp, rspmov edi, 3call factorial(int)
L4: mov esi, eaxmov edi, OFFSET FLAT:.LC0mov eax, 0call printfmov eax, 0pop rbpret
Code/DataStack
rbp
rsp
777777777777777777
1
edi
777777777777777756
7777777402
2
eax
777777756
777777736
777777732
7777777161
![Page 45: X86 Assembly - cs.tau.ac.il](https://reader031.fdocuments.us/reader031/viewer/2022020622/61ec44e2b1ab7526193cbc6c/html5/thumbnails/45.jpg)
factorial(int):…
.LC0:.string "factorial(2)=%d"
main:push rbpmov rbp, rspmov edi, 2call factorial(int)
L4: mov esi, eaxmov edi, OFFSET FLAT:.LC0mov eax, 0call printfmov eax, 0pop rbpret
Code/DataStack
rbp
rsp
777777777777777777
1
edi
777777777777777756
7777777402
2
eax
777777756
777777736
777777732
7777777161
2
esi
![Page 46: X86 Assembly - cs.tau.ac.il](https://reader031.fdocuments.us/reader031/viewer/2022020622/61ec44e2b1ab7526193cbc6c/html5/thumbnails/46.jpg)
factorial(int):…
.LC0:.string "factorial(3)=%d"
main:push rbpmov rbp, rspmov edi, 3call factorial(int)
L4: mov esi, eaxmov edi, OFFSET FLAT:.LC0mov eax, 0call printfmov eax, 0pop rbpret
Code/DataStack
rbp
rsp
777777777777777777
LC0
edi
777777777777777756
7777777402
2
eax
777777756
777777736
777777732
7777777161
2
esi
![Page 47: X86 Assembly - cs.tau.ac.il](https://reader031.fdocuments.us/reader031/viewer/2022020622/61ec44e2b1ab7526193cbc6c/html5/thumbnails/47.jpg)
factorial(int):…
.LC0:.string "factorial(3)=%d"
main:push rbpmov rbp, rspmov edi, 3call factorial(int)
L4: mov esi, eaxmov edi, OFFSET FLAT:.LC0mov eax, 0call printfmov eax, 0pop rbpret
Code/DataStack
rbp
rsp
777777777777777777
LC0
edi
777777777777777756
7777777402
0
eax
777777756
777777736
777777732
7777777161
2
esi
![Page 48: X86 Assembly - cs.tau.ac.il](https://reader031.fdocuments.us/reader031/viewer/2022020622/61ec44e2b1ab7526193cbc6c/html5/thumbnails/48.jpg)
Summary
• Pentium X86 is a powerful CISC architecture
• Stack frames provide memory locality• Simple allocation/deallocation
• Efficient even for recursive calls
• Architecture support may help
• Understanding compiler generated code is not easy