48
X86 Assembly Mooly Sagiv http://www.egr.unlv.edu/~ed/assembly64.pdf https://godbolt.org/ https://www.cis.upenn.edu/~stevez/ CS 341

X86 Assembly - cs.tau.ac.il

  • Upload
    others

  • View
    17

  • Download
    0

Embed Size (px)

Citation preview

Page 1: X86 Assembly - cs.tau.ac.il

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

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

Outline

• X86 history

• Memory hierarchy

• Stack frames

• Compiling a simple example

• Running a simple example

Page 4: X86 Assembly - cs.tau.ac.il

Intel’s X86 Architecture

Page 5: X86 Assembly - cs.tau.ac.il

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
Page 7: X86 Assembly - cs.tau.ac.il

Memory vs. CPU Speed

Page 8: X86 Assembly - cs.tau.ac.il

Solutions

• Architecture & Compiler• Machine registers utilized by compiler

• Explore locality

Page 9: X86 Assembly - cs.tau.ac.il

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

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
Page 12: X86 Assembly - cs.tau.ac.il

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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