passing parameters through the stack - smith college · passing parameters through the stack d....

37
Passing Parameters Through the Stack D. Thiebaut — CSC231

Upload: buidan

Post on 08-Sep-2018

233 views

Category:

Documents


0 download

TRANSCRIPT

Passing Parameters Through the Stack

D. Thiebaut — CSC231

Pass a & b via Registers

section .dataa dd 1234 b dd 5555 result dd 0

section .text

mov eax,dword [a] mov ebx,dword [b] call sum* mov dword [result], eax

mov eax,SYS_EXIT mov ebx,0 int 0x80

;;; ----------------------------;;; sum function;;; adds eax+ebx and return in eax;;; registers modified: ax;;; ----------------------------sum: add eax,ebx ret

incr

easi

ng a

ddre

sses

esp

section .dataa dd 1234 b dd 5555 result dd 0

section .text

mov eax,dword [a] mov ebx,dword [b] call sum* mov dword [result], eax

mov eax,SYS_EXIT mov ebx,0 int 0x80

;;; ----------------------------;;; sum function;;; adds eax+ebx and return in eax;;; registers modified: ax;;; ----------------------------sum: add eax,ebx ret

incr

easi

ng a

ddre

sses

esp

return address *

section .dataa dd 1234 b dd 5555 result dd 0

section .text

mov eax,dword [a] mov ebx,dword [b] call sum* mov dword [result], eax

mov eax,SYS_EXIT mov ebx,0 int 0x80

;;; ----------------------------;;; sum function;;; adds eax+ebx and return in eax;;; registers modified: ax;;; ----------------------------sum: add eax,ebx ret

incr

easi

ng a

ddre

sses

esp

return address *

section .dataa dd 1234 b dd 5555 result dd 0

section .text

mov eax,dword [a] mov ebx,dword [b] call sum* mov dword [result], eax

mov eax,SYS_EXIT mov ebx,0 int 0x80

;;; ----------------------------;;; sum function;;; adds eax+ebx and return in eax;;; registers modified: ax;;; ----------------------------sum: add eax,ebx ret

incr

easi

ng a

ddre

sses

esp

Pass a & b Through The Stack

section .dataa dd 0x1234 b dd 0x5555 result dd 0

section .text push dword [a] push dword [b] call sum mov dword[result], eax

…;;; sum functionsum: push ebp mov ebp,esp

mov eax,dword [ebp+8] add eax,dword [ebp+12] pop ebp ret 8

incr

easi

ng a

ddre

sses

ebp

esp

ebp

esp section .dataa dd 0x1234 b dd 0x5555 result dd 0

section .text push dword [a] push dword [b] call sum mov dword[result], eax

…;;; sum functionsum: push ebp mov ebp,esp

mov eax,dword [ebp+8] add eax,dword [ebp+12] pop ebp ret 8

incr

easi

ng a

ddre

sses

00001234

section .dataa dd 0x1234 b dd 0x5555 result dd 0

section .text push dword [a] push dword [b] call sum * mov dword[result], eax

…;;; sum functionsum: push ebp mov ebp,esp

mov eax,dword [ebp+8] add eax,dword [ebp+12] pop ebp ret 8

incr

easi

ng a

ddre

sses

ebp

esp

00001234

00005555

section .dataa dd 0x1234 b dd 0x5555 result dd 0

section .text push dword [a] push dword [b] call sum * mov dword[result], eax …;;; sum functionsum: push ebp mov ebp,esp

mov eax,dword [ebp+8] add eax,dword [ebp+12] pop ebp ret 8

incr

easi

ng a

ddre

sses

ebp

esp

00001234

00005555

return address *

section .dataa dd 0x1234 b dd 0x5555 result dd 0

section .text push dword [a] push dword [b] call sum * mov dword[result], eax …;;; sum functionsum: push ebp mov ebp,esp

mov eax,dword [ebp+8] add eax,dword [ebp+12] pop ebp ret 8

incr

easi

ng a

ddre

sses

ebp

esp

00001234

00005555

return address *

old ebp

section .dataa dd 0x1234 b dd 0x5555 result dd 0

section .text push dword [a] push dword [b] call sum * mov dword[result], eax …;;; sum functionsum: push ebp mov ebp,esp

mov eax,dword [ebp+8] add eax,dword [ebp+12] pop ebp ret 8

incr

easi

ng a

ddre

sses

ebp

esp

00001234

00005555

return address *

old ebp

section .dataa dd 0x1234 b dd 0x5555 result dd 0

section .text push dword [a] push dword [b] call sum * mov dword[result], eax …;;; sum functionsum: push ebp mov ebp,esp

mov eax,dword [ebp+8] add eax,dword [ebp+12] pop ebp ret 8

incr

easi

ng a

ddre

sses

ebp

esp

00001234

00005555

return address *

old ebp

Stack Frame

section .dataa dd 0x1234 b dd 0x5555 result dd 0

section .text push dword [a] push dword [b] call sum * mov dword[result], eax …;;; sum functionsum: push ebp mov ebp,esp

mov eax,dword [ebp+8] add eax,dword [ebp+12] pop ebp ret 8

incr

easi

ng a

ddre

sses

ebp

esp

00001234

00005555

return address *

old ebp

section .dataa dd 0x1234 b dd 0x5555 result dd 0

section .text push dword [a] push dword [b] call sum * mov dword[result], eax …;;; sum functionsum: push ebp mov ebp,esp

mov eax,dword [ebp+8] add eax,dword [ebp+12] pop ebp ret 8

incr

easi

ng a

ddre

sses

ebp

esp

00001234

00005555

return address *

xxxx xxxx

section .dataa dd 0x1234 b dd 0x5555 result dd 0

section .text push dword [a] push dword [b] call sum * mov dword[result], eax …;;; sum functionsum: push ebp mov ebp,esp

mov eax,dword [ebp+8] add eax,dword [ebp+12] pop ebp ret 8

incr

easi

ng a

ddre

sses

ebp

xxxx xxxx

xxxx xxxx

xxxx xxxx

xxxx xxxx

esp

• Why do we bother pushing ebp when the function starts?

Question:

Exercises

Exercises 1 & 2

• Write a new printDec() function that gets the number to print through the stack. The function should not modify any register upon its return.

• Write a new printString() function that prints a string, and that gets the string address and length through the stack. The function should not modify any register upon its return.

Exercise 3• The sum function illustrated above modifies eax

when it performs the addition. If eax had contained an important piece of information in the main program, the function would have overwritten it.

• Modify the function so that it saves eax before using it.

• Show the behavior of the stack as the function executes.

Exercise 4

• Make the sum function call your new printString function to make it print the sum of the two parameters before it (sum) returns to the main program. Show the stack behavior as the program executes.

Pass a & b by value, and pass result by

reference

section .dataa dd 0x1234 b dd 0x5555 result dd 0

section .text mov eax, result push eax push dword [a] push dword [b] call sum

…;;; sum functionsum: push ebp mov ebp,esp push eax push ebx mov eax,dword [ebp+8] add eax,dword [ebp+12] mov ebx,dword [ebp+16] mov dword[ebx], eax pop ebx pop eax pop ebp ret 12

incr

easi

ng a

ddre

sses

ebp

esp

section .dataa dd 0x1234 b dd 0x5555 result dd 0

section .text mov eax, result push eax push dword [a] push dword [b] call sum

…;;; sum functionsum: push ebp mov ebp,esp push eax push ebx mov eax,dword [ebp+8] add eax,dword [ebp+12] mov ebx,dword [ebp+16] mov dword[ebx], eax pop ebx pop eax pop ebp ret 12

incr

easi

ng a

ddre

sses

ebp

&result

esp

section .dataa dd 0x1234 b dd 0x5555 result dd 0

section .text mov eax, result push eax push dword [a] push dword [b] call sum

…;;; sum functionsum: push ebp mov ebp,esp push eax push ebx mov eax,dword [ebp+8] add eax,dword [ebp+12] mov ebx,dword [ebp+16] mov dword[ebx], eax pop ebx pop eax pop ebp ret 12

incr

easi

ng a

ddre

sses

ebp

&result

00001234

esp

section .dataa dd 0x1234 b dd 0x5555 result dd 0

section .text mov eax, result push eax push dword [a] push dword [b] call sum

…;;; sum functionsum: push ebp mov ebp,esp push eax push ebx mov eax,dword [ebp+8] add eax,dword [ebp+12] mov ebx,dword [ebp+16] mov dword[ebx], eax pop ebx pop eax pop ebp ret 12

incr

easi

ng a

ddre

sses

ebp

&result

00001234

00005555

esp

section .dataa dd 0x1234 b dd 0x5555 result dd 0

section .text mov eax, result push eax push dword [a] push dword [b] call sum *

…;;; sum functionsum: push ebp mov ebp,esp push eax push ebx mov eax,dword [ebp+8] add eax,dword [ebp+12] mov ebx,dword [ebp+16] mov dword[ebx], eax pop ebx pop eax pop ebp ret 12

incr

easi

ng a

ddre

sses

ebp

&result

00001234

00005555

ret. addr *

esp

section .dataa dd 0x1234 b dd 0x5555 result dd 0

section .text mov eax, result push eax push dword [a] push dword [b] call sum *

…;;; sum functionsum: push ebp mov ebp,esp push eax push ebx mov eax,dword [ebp+8] add eax,dword [ebp+12] mov ebx,dword [ebp+16] mov dword[ebx], eax pop ebx pop eax pop ebp ret 12

incr

easi

ng a

ddre

sses

ebp

&result

00001234

00005555

ret. addr *

old ebp

esp

section .dataa dd 0x1234 b dd 0x5555 result dd 0

section .text mov eax, result push eax push dword [a] push dword [b] call sum *

…;;; sum functionsum: push ebp mov ebp,esp push eax push ebx mov eax,dword [ebp+8] add eax,dword [ebp+12] mov ebx,dword [ebp+16] mov dword[ebx], eax pop ebx pop eax pop ebp ret 12

incr

easi

ng a

ddre

sses

ebp

&result

00001234

00005555

ret. addr *

old ebp

esp

section .dataa dd 0x1234 b dd 0x5555 result dd 0

section .text mov eax, result push eax push dword [a] push dword [b] call sum *

…;;; sum functionsum: push ebp mov ebp,esp push eax push ebx mov eax,dword [ebp+8] add eax,dword [ebp+12] mov ebx,dword [ebp+16] mov dword[ebx], eax pop ebx pop eax pop ebp ret 12

incr

easi

ng a

ddre

sses

ebp

&result

00001234

00005555

ret. addr *

old ebp

old eax

esp

section .dataa dd 0x1234 b dd 0x5555 result dd 0

section .text mov eax, result push eax push dword [a] push dword [b] call sum *

…;;; sum functionsum: push ebp mov ebp,esp push eax push ebx mov eax,dword [ebp+8] add eax,dword [ebp+12] mov ebx,dword [ebp+16] mov dword[ebx], eax pop ebx pop eax pop ebp ret 12

incr

easi

ng a

ddre

sses

ebp

&result

00001234

00005555

ret. addr *

old ebp

old eax

old ex

esp

section .dataa dd 0x1234 b dd 0x5555 result dd 0

section .text mov eax, result push eax push dword [a] push dword [b] call sum *

…;;; sum functionsum: push ebp mov ebp,esp push eax push ebx mov eax,dword [ebp+8] add eax,dword [ebp+12] mov ebx,dword [ebp+16] mov dword[ebx], eax pop ebx pop eax pop ebp ret 12

incr

easi

ng a

ddre

sses

ebp

&result

00001234

00005555

ret. addr *

old ebp

old eax

old ex

esp

section .dataa dd 0x1234 b dd 0x5555 result dd 0

section .text mov eax, result push eax push dword [a] push dword [b] call sum *

…;;; sum functionsum: push ebp mov ebp,esp push eax push ebx mov eax,dword [ebp+8] add eax,dword [ebp+12] mov ebx,dword [ebp+16] mov dword[ebx], eax pop ebx pop eax pop ebp ret 12

incr

easi

ng a

ddre

sses

ebp

&result

00001234

00005555

ret. addr *

old ebp

old eax

xxxxxxxx

esp

section .dataa dd 0x1234 b dd 0x5555 result dd 0

section .text mov eax, result push eax push dword [a] push dword [b] call sum *

…;;; sum functionsum: push ebp mov ebp,esp push eax push ebx mov eax,dword [ebp+8] add eax,dword [ebp+12] mov ebx,dword [ebp+16] mov dword[ebx], eax pop ebx pop eax pop ebp ret 12

incr

easi

ng a

ddre

sses

ebp

&result

00001234

00005555

ret. addr *

old ebp

xxxxxxxx

xxxxxxxx

esp

section .dataa dd 0x1234 b dd 0x5555 result dd 0

section .text mov eax, result push eax push dword [a] push dword [b] call sum *

…;;; sum functionsum: push ebp mov ebp,esp push eax push ebx mov eax,dword [ebp+8] add eax,dword [ebp+12] mov ebx,dword [ebp+16] mov dword[ebx], eax pop ebx pop eax pop ebp ret 12

incr

easi

ng a

ddre

sses

ebp

&result

00001234

00005555

ret. addr *

xxxxxxxx

xxxxxxxx

xxxxxxxx

esp

section .dataa dd 0x1234 b dd 0x5555 result dd 0

section .text mov eax, result push eax push dword [a] push dword [b] call sum *

…;;; sum functionsum: push ebp mov ebp,esp push eax push ebx mov eax,dword [ebp+8] add eax,dword [ebp+12] mov ebx,dword [ebp+16] mov dword[ebx], eax pop ebx pop eax pop ebp ret 12

incr

easi

ng a

ddre

sses

ebp

xxxxxxxx

xxxxxxxx

xxxxxxxx

xxxxxxxx

xxxxxxxx

xxxxxxxx

xxxxxxxx

esp