+ All Categories
Home > Technology > Calling Functions

Calling Functions

Date post: 15-Apr-2017
Category:
Upload: patrick-hawks
View: 342 times
Download: 0 times
Share this document with a friend
41
callingFunctions.S Passing arguments to functions via the stack
Transcript

callingFunctions.SPassing arguments to functions via the stack

LC0:.ascii "The argument was %d\12\0".text.globl _main.def _main; .scl 2; .type 32; .endef

_main:pushl %ebpmovl %esp, %ebpandl $-16, %espsubl $32, %espcall ___mainmovl $1234, 28(%esp)movl 12(%ebp), %eaxaddl $4, %eax

8(%esp) argv

4(%esp) argc

(%esp) return addr

%esp 28ff2c %ebp old %ebp %eax $0

LC0:.ascii "The argument was %d\12\0".text.globl _main.def _main; .scl 2; .type 32; .endef

_main:pushl %ebpmovl %esp, %ebpandl $-16, %espsubl $32, %espcall ___mainmovl $1234, 28(%esp)movl 12(%ebp), %eaxaddl $4, %eax

8(%esp) argv

4(%esp) argc

(%esp) return addr

%esp 28ff2c %ebp old %ebp %eax $0

LC0:.ascii "The argument was %d\12\0".text.globl _main.def _main; .scl 2; .type 32; .endef

_main:pushl %ebpmovl %esp, %ebpandl $-16, %espsubl $32, %espcall ___mainmovl $1234, 28(%esp)movl 12(%ebp), %eaxaddl $4, %eax

12(%esp) argv

8(%esp) argc

4(%esp) return addr

(%esp) old %ebp

%esp 28ff28 %ebp old %ebp %eax $0

LC0:.ascii "The argument was %d\12\0".text.globl _main.def _main; .scl 2; .type 32; .endef

_main:pushl %ebpmovl %esp, %ebpandl $-16, %espsubl $32, %espcall ___mainmovl $1234, 28(%esp)movl 12(%ebp), %eaxaddl $4, %eax

12(%esp) argv

8(%esp) argc

4(%esp) return addr

(%esp) old %ebp

%esp 28ff28 %ebp old %ebp %eax $0

LC0:.ascii "The argument was %d\12\0".text.globl _main.def _main; .scl 2; .type 32; .endef

_main:pushl %ebpmovl %esp, %ebpandl $-16, %espsubl $32, %espcall ___mainmovl $1234, 28(%esp)movl 12(%ebp), %eaxaddl $4, %eax

12(%ebp) argv

8(%ebp) argc

4(%ebp) return addr

(%ebp) old %ebp

%esp 28ff28 %ebp 28ff28 %eax $0

LC0:.ascii "The argument was %d\12\0".text.globl _main.def _main; .scl 2; .type 32; .endef

_main:pushl %ebpmovl %esp, %ebpandl $-16, %espsubl $32, %espcall ___mainmovl $1234, 28(%esp)movl 12(%ebp), %eaxaddl $4, %eax

12(%ebp) argv

8(%ebp) argc

4(%ebp) return addr

(%ebp) old %ebp

%esp 28ff28 %ebp 28ff28 %eax $0

LC0:.ascii "The argument was %d\12\0".text.globl _main.def _main; .scl 2; .type 32; .endef

_main:pushl %ebpmovl %esp, %ebpandl $-16, %espsubl $32, %espcall ___mainmovl $1234, 28(%esp)movl 12(%ebp), %eaxaddl $4, %eax

12(%ebp) argv

8(%ebp) argc

4(%ebp) return addr

(%ebp) old %ebp

%esp 28ff20 %ebp 28ff28 %eax $0

LC0:.ascii "The argument was %d\12\0".text.globl _main.def _main; .scl 2; .type 32; .endef

_main:pushl %ebpmovl %esp, %ebpandl $-16, %espsubl $32, %espcall ___mainmovl $1234, 28(%esp)movl 12(%ebp), %eaxaddl $4, %eax

12(%ebp) argv

8(%ebp) argc

4(%ebp) return addr

(%ebp) old %ebp

%esp 28ff20 %ebp 28ff28 %eax $0

LC0:.ascii "The argument was %d\12\0".text.globl _main.def _main; .scl 2; .type 32; .endef

_main:pushl %ebpmovl %esp, %ebpandl $-16, %espsubl $32, %espcall ___mainmovl $1234, 28(%esp)movl 12(%ebp), %eaxaddl $4, %eax

12(%ebp) argv

8(%ebp) argc

4(%ebp) return addr

(%ebp) old %ebp

28(%esp)

24(%esp)

20(%esp)

16(%esp)

12(%esp)

8(%esp)

4(%esp)

(%esp) %esp 28ff00 %ebp 28ff28 %eax $0

LC0:.ascii "The argument was %d\12\0".text.globl _main.def _main; .scl 2; .type 32; .endef

_main:pushl %ebpmovl %esp, %ebpandl $-16, %espsubl $32, %espcall ___mainmovl $1234, 28(%esp)movl 12(%ebp), %eaxaddl $4, %eax

12(%ebp) argv

8(%ebp) argc

4(%ebp) return addr

(%ebp) old %ebp

28(%esp)

24(%esp)

20(%esp)

16(%esp)

12(%esp)

8(%esp)

4(%esp)

(%esp) %esp 28ff00 %ebp 28ff28 %eax $0

.ascii "The argument was %d\12\0"

.text

.globl _main

.def _main; .scl 2; .type 32; .endef_main:pushl %ebpmovl %esp, %ebpandl $-16, %espsubl $32, %espcall ___mainmovl $1234, 28(%esp)movl 12(%ebp), %eaxaddl $4, %eaxmovl (%eax), %eax

12(%ebp) argv

8(%ebp) argc

4(%ebp) return addr

(%ebp) old %ebp

28(%esp)

24(%esp)

20(%esp)

16(%esp)

12(%esp)

8(%esp)

4(%esp)

(%esp) %esp 28ff00 %ebp 28ff28 %eax $0

.ascii "The argument was %d\12\0"

.text

.globl _main

.def _main; .scl 2; .type 32; .endef_main:pushl %ebpmovl %esp, %ebpandl $-16, %espsubl $32, %espcall ___mainmovl $1234, 28(%esp)movl 12(%ebp), %eaxaddl $4, %eaxmovl (%eax), %eax

12(%ebp) argv

8(%ebp) argc

4(%ebp) return addr

(%ebp) old %ebp

28(%esp) $1234

24(%esp)

20(%esp)

16(%esp)

12(%esp)

8(%esp)

4(%esp)

(%esp) %esp 28ff00 %ebp 28ff28 %eax $0

.text

.globl _main

.def _main; .scl 2; .type 32; .endef_main:pushl %ebpmovl %esp, %ebpandl $-16, %espsubl $32, %espcall ___mainmovl $1234, 28(%esp)movl 12(%ebp), %eaxaddl $4, %eaxmovl (%eax), %eaxmovl %eax, (%esp)

12(%ebp) argv

8(%ebp) argc

4(%ebp) return addr

(%ebp) old %ebp

28(%esp) $1234

24(%esp)

20(%esp)

16(%esp)

12(%esp)

8(%esp)

4(%esp)

(%esp) %esp 28ff00 %ebp 28ff28 %eax $0

.text

.globl _main

.def _main; .scl 2; .type 32; .endef_main:pushl %ebpmovl %esp, %ebpandl $-16, %espsubl $32, %espcall ___mainmovl $1234, 28(%esp)movl 12(%ebp), %eaxaddl $4, %eaxmovl (%eax), %eaxmovl %eax, (%esp)

12(%ebp) argv

8(%ebp) argc

4(%ebp) return addr

(%ebp) old %ebp

28(%esp) $1234

24(%esp)

20(%esp)

16(%esp)

12(%esp)

8(%esp)

4(%esp)

(%esp) %esp 28ff00 %ebp 28ff28 %eax argv

.text

.globl _main

.def _main; .scl 2; .type 32; .endef_main:pushl %ebpmovl %esp, %ebpandl $-16, %espsubl $32, %espcall ___mainmovl $1234, 28(%esp)movl 12(%ebp), %eaxaddl $4, %eaxmovl (%eax), %eaxmovl %eax, (%esp)

12(%ebp) argv

8(%ebp) argc

4(%ebp) return addr

(%ebp) old %ebp

28(%esp) $1234

24(%esp)

20(%esp)

16(%esp)

12(%esp)

8(%esp)

4(%esp)

(%esp) %esp 28ff00 %ebp 28ff28 %eax argv

Address ofpointer toprog name

.globl _main

.def _main; .scl 2; .type 32; .endef_main:pushl %ebpmovl %esp, %ebpandl $-16, %espsubl $32, %espcall ___mainmovl $1234, 28(%esp)movl 12(%ebp), %eaxaddl $4, %eaxmovl (%eax), %eaxmovl %eax, (%esp)call _atoi

12(%ebp) argv

8(%ebp) argc

4(%ebp) return addr

(%ebp) old %ebp

28(%esp) $1234

24(%esp)

20(%esp)

16(%esp)

12(%esp)

8(%esp)

4(%esp)

(%esp) %esp 28ff00 %ebp 28ff28 %eax argv

Address ofpointer toprog name

.globl _main

.def _main; .scl 2; .type 32; .endef_main:pushl %ebpmovl %esp, %ebpandl $-16, %espsubl $32, %espcall ___mainmovl $1234, 28(%esp)movl 12(%ebp), %eaxaddl $4, %eaxmovl (%eax), %eaxmovl %eax, (%esp)call _atoi

12(%ebp) argv

8(%ebp) argc

4(%ebp) return addr

(%ebp) old %ebp

28(%esp) $1234

24(%esp)

20(%esp)

16(%esp)

12(%esp)

8(%esp)

4(%esp)

(%esp) %esp 28ff00 %ebp 28ff28 %eax argv+4

Address ofpointer to

first arg

.def _main; .scl 2; .type 32; .endef_main:pushl %ebpmovl %esp, %ebpandl $-16, %espsubl $32, %espcall ___mainmovl $1234, 28(%esp)movl 12(%ebp), %eaxaddl $4, %eaxmovl (%eax), %eaxmovl %eax, (%esp)call _atoimovl %eax, 28(%esp)

12(%ebp) argv

8(%ebp) argc

4(%ebp) return addr

(%ebp) old %ebp

28(%esp) $1234

24(%esp)

20(%esp)

16(%esp)

12(%esp)

8(%esp)

4(%esp)

(%esp) %esp 28ff00 %ebp 28ff28 %eax argv+4

Address ofpointer to

first arg

.def _main; .scl 2; .type 32; .endef_main:pushl %ebpmovl %esp, %ebpandl $-16, %espsubl $32, %espcall ___mainmovl $1234, 28(%esp)movl 12(%ebp), %eaxaddl $4, %eaxmovl (%eax), %eaxmovl %eax, (%esp)call _atoimovl %eax, 28(%esp)

12(%ebp) argv

8(%ebp) argc

4(%ebp) return addr

(%ebp) old %ebp

28(%esp) $1234

24(%esp)

20(%esp)

16(%esp)

12(%esp)

8(%esp)

4(%esp)

(%esp) %esp 28ff00 %ebp 28ff28 %eax argv[1]

pointer tofirst arg

_main:pushl %ebpmovl %esp, %ebpandl $-16, %espsubl $32, %espcall ___mainmovl $1234, 28(%esp)movl 12(%ebp), %eaxaddl $4, %eaxmovl (%eax), %eaxmovl %eax, (%esp)call _atoimovl %eax, 28(%esp)movl 28(%esp), %eax

12(%ebp) argv

8(%ebp) argc

4(%ebp) return addr

(%ebp) old %ebp

28(%esp) $1234

24(%esp)

20(%esp)

16(%esp)

12(%esp)

8(%esp)

4(%esp)

(%esp) %esp 28ff00 %ebp 28ff28 %eax argv[1]

_main:pushl %ebpmovl %esp, %ebpandl $-16, %espsubl $32, %espcall ___mainmovl $1234, 28(%esp)movl 12(%ebp), %eaxaddl $4, %eaxmovl (%eax), %eaxmovl %eax, (%esp)call _atoimovl %eax, 28(%esp)movl 28(%esp), %eax

12(%ebp) argv

8(%ebp) argc

4(%ebp) return addr

(%ebp) old %ebp

28(%esp) $1234

24(%esp)

20(%esp)

16(%esp)

12(%esp)

8(%esp)

4(%esp)

(%esp) argv[1] %esp 28ff00 %ebp 28ff28 %eax argv[1]

_main:pushl %ebpmovl %esp, %ebpandl $-16, %espsubl $32, %espcall ___mainmovl $1234, 28(%esp)movl 12(%ebp), %eaxaddl $4, %eaxmovl (%eax), %eaxmovl %eax, (%esp)call _atoimovl %eax, 28(%esp)movl 28(%esp), %eax

For our purposesargv[1] = "67"

12(%ebp) argv

8(%ebp) argc

4(%ebp) return addr

(%ebp) old %ebp

28(%esp) $1234

24(%esp)

20(%esp)

16(%esp)

12(%esp)

8(%esp)

4(%esp)

(%esp) argv[1] %esp 28ff00 %ebp 28ff28 %eax argv[1]

pushl %ebpmovl %esp, %ebpandl $-16, %espsubl $32, %espcall ___mainmovl $1234, 28(%esp)movl 12(%ebp), %eaxaddl $4, %eaxmovl (%eax), %eaxmovl %eax, (%esp)call _atoimovl %eax, 28(%esp)movl 28(%esp), %eaxmovl %eax, 4(%esp)

For our purposesargv[1] = "67"

12(%ebp) argv

8(%ebp) argc

4(%ebp) return addr

(%ebp) old %ebp

28(%esp) $1234

24(%esp)

20(%esp)

16(%esp)

12(%esp)

8(%esp)

4(%esp)

(%esp) argv[1] %esp 28ff00 %ebp 28ff28 %eax argv[1]

pushl %ebpmovl %esp, %ebpandl $-16, %espsubl $32, %espcall ___mainmovl $1234, 28(%esp)movl 12(%ebp), %eaxaddl $4, %eaxmovl (%eax), %eaxmovl %eax, (%esp)call _atoimovl %eax, 28(%esp)movl 28(%esp), %eaxmovl %eax, 4(%esp)

For our purposesargv[1] = "67"

_atoi grabs the char array at the address stored in (%esp), converts the ASCII string to an

int, and returns the int in %eax

12(%ebp) argv

8(%ebp) argc

4(%ebp) return addr

(%ebp) old %ebp

28(%esp) $1234

24(%esp)

20(%esp)

16(%esp)

12(%esp)

8(%esp)

4(%esp)

(%esp) argv[1] %esp 28ff00 %ebp 28ff28 %eax argv[1]

pushl %ebpmovl %esp, %ebpandl $-16, %espsubl $32, %espcall ___mainmovl $1234, 28(%esp)movl 12(%ebp), %eaxaddl $4, %eaxmovl (%eax), %eaxmovl %eax, (%esp)call _atoimovl %eax, 28(%esp)movl 28(%esp), %eaxmovl %eax, 4(%esp)

For our purposesargv[1] = "67"

_atoi grabs the char array at the address stored in (%esp), converts the ASCII string to an

int, and returns the int in %eax

12(%ebp) argv

8(%ebp) argc

4(%ebp) return addr

(%ebp) old %ebp

28(%esp) $1234

24(%esp)

20(%esp)

16(%esp)

12(%esp)

8(%esp)

4(%esp)

(%esp) argv[1] %esp 28ff00 %ebp 28ff28 %eax $67

movl %esp, %ebpandl $-16, %espsubl $32, %espcall ___mainmovl $1234, 28(%esp)movl 12(%ebp), %eaxaddl $4, %eaxmovl (%eax), %eaxmovl %eax, (%esp)call _atoimovl %eax, 28(%esp)movl 28(%esp), %eaxmovl %eax, 4(%esp)movl $LC0, (%esp)

12(%ebp) argv

8(%ebp) argc

4(%ebp) return addr

(%ebp) old %ebp

28(%esp) $1234

24(%esp)

20(%esp)

16(%esp)

12(%esp)

8(%esp)

4(%esp)

(%esp) argv[1] %esp 28ff00 %ebp 28ff28 %eax $67

movl %esp, %ebpandl $-16, %espsubl $32, %espcall ___mainmovl $1234, 28(%esp)movl 12(%ebp), %eaxaddl $4, %eaxmovl (%eax), %eaxmovl %eax, (%esp)call _atoimovl %eax, 28(%esp)movl 28(%esp), %eaxmovl %eax, 4(%esp)movl $LC0, (%esp)

12(%ebp) argv

8(%ebp) argc

4(%ebp) return addr

(%ebp) old %ebp

28(%esp) $67

24(%esp)

20(%esp)

16(%esp)

12(%esp)

8(%esp)

4(%esp)

(%esp) argv[1] %esp 28ff00 %ebp 28ff28 %eax $67

andl $-16, %espsubl $32, %espcall ___mainmovl $1234, 28(%esp)movl 12(%ebp), %eaxaddl $4, %eaxmovl (%eax), %eaxmovl %eax, (%esp)call _atoimovl %eax, 28(%esp)movl 28(%esp), %eaxmovl %eax, 4(%esp)movl $LC0, (%esp)call _printf

12(%ebp) argv

8(%ebp) argc

4(%ebp) return addr

(%ebp) old %ebp

28(%esp) $67

24(%esp)

20(%esp)

16(%esp)

12(%esp)

8(%esp)

4(%esp)

(%esp) argv[1] %esp 28ff00 %ebp 28ff28 %eax $67

subl $32, %espcall ___mainmovl $1234, 28(%esp)movl 12(%ebp), %eaxaddl $4, %eaxmovl (%eax), %eaxmovl %eax, (%esp)call _atoimovl %eax, 28(%esp)movl 28(%esp), %eaxmovl %eax, 4(%esp)movl $LC0, (%esp)call _printfmovl $0, %eax

12(%ebp) argv

8(%ebp) argc

4(%ebp) return addr

(%ebp) old %ebp

28(%esp) $67

24(%esp)

20(%esp)

16(%esp)

12(%esp)

8(%esp)

4(%esp)

(%esp) argv[1] %esp 28ff00 %ebp 28ff28 %eax $67

subl $32, %espcall ___mainmovl $1234, 28(%esp)movl 12(%ebp), %eaxaddl $4, %eaxmovl (%eax), %eaxmovl %eax, (%esp)call _atoimovl %eax, 28(%esp)movl 28(%esp), %eaxmovl %eax, 4(%esp)movl $LC0, (%esp)call _printfmovl $0, %eax

12(%ebp) argv

8(%ebp) argc

4(%ebp) return addr

(%ebp) old %ebp

28(%esp) $67

24(%esp)

20(%esp)

16(%esp)

12(%esp)

8(%esp)

4(%esp) $67

(%esp) argv[1] %esp 28ff00 %ebp 28ff28 %eax $67

call ___mainmovl $1234, 28(%esp)movl 12(%ebp), %eaxaddl $4, %eaxmovl (%eax), %eaxmovl %eax, (%esp)call _atoimovl %eax, 28(%esp)movl 28(%esp), %eaxmovl %eax, 4(%esp)movl $LC0, (%esp)call _printfmovl $0, %eaxleave

12(%ebp) argv

8(%ebp) argc

4(%ebp) return addr

(%ebp) old %ebp

28(%esp) $67

24(%esp)

20(%esp)

16(%esp)

12(%esp)

8(%esp)

4(%esp) $67

(%esp) argv[1] %esp 28ff00 %ebp 28ff28 %eax $67

call ___mainmovl $1234, 28(%esp)movl 12(%ebp), %eaxaddl $4, %eaxmovl (%eax), %eaxmovl %eax, (%esp)call _atoimovl %eax, 28(%esp)movl 28(%esp), %eaxmovl %eax, 4(%esp)movl $LC0, (%esp)call _printfmovl $0, %eaxleave

12(%ebp) argv

8(%ebp) argc

4(%ebp) return addr

(%ebp) old %ebp

28(%esp) $67

24(%esp)

20(%esp)

16(%esp)

12(%esp)

8(%esp)

4(%esp) $67

(%esp) $LC0 %esp 28ff00 %ebp 28ff28 %eax $67

call ___mainmovl $1234, 28(%esp)movl 12(%ebp), %eaxaddl $4, %eaxmovl (%eax), %eaxmovl %eax, (%esp)call _atoimovl %eax, 28(%esp)movl 28(%esp), %eaxmovl %eax, 4(%esp)movl $LC0, (%esp)call _printfmovl $0, %eaxleave

12(%ebp) argv

8(%ebp) argc

4(%ebp) return addr

(%ebp) old %ebp

28(%esp) $67

24(%esp)

20(%esp)

16(%esp)

12(%esp)

8(%esp)

4(%esp) $67

(%esp) $LC0

$LC0 is the location in memoryof our format string.

"The argument was %d\12\0"

%esp 28ff00 %ebp 28ff28 %eax $67

call ___mainmovl $1234, 28(%esp)movl 12(%ebp), %eax

addl $4, %eaxmovl (%eax), %eaxmovl %eax, (%esp)call _atoimovl %eax, 28(%esp)movl 28(%esp), %eaxmovl %eax, 4(%esp)movl $LC0, (%esp)call _printfmovl $0, %eaxleaveret

12(%ebp) argv

8(%ebp) argc

4(%ebp) return addr

(%ebp) old %ebp

28(%esp) $67

24(%esp)

20(%esp)

16(%esp)

12(%esp)

8(%esp)

4(%esp) $67

(%esp) $LC0 %esp 28ff00 %ebp 28ff28 %eax $67

$LC0 is the location in memoryof our format string.

"The argument was %d\12\0"

movl $1234, 28(%esp)movl 12(%ebp), %eaxaddl $4, %eaxmovl (%eax), %eaxmovl %eax, (%esp)call _atoimovl %eax, 28(%esp)movl 28(%esp), %eaxmovl %eax, 4(%esp)movl $LC0, (%esp)call _printfmovl $0, %eaxleaveret

12(%ebp) argv

8(%ebp) argc

4(%ebp) return addr

(%ebp) old %ebp

28(%esp) $67

24(%esp)

20(%esp)

16(%esp)

12(%esp)

8(%esp)

4(%esp) $67

(%esp) $LC0 %esp 28ff00 %ebp 28ff28 %eax $67

movl $1234, 28(%esp)movl 12(%ebp), %eaxaddl $4, %eaxmovl (%eax), %eaxmovl %eax, (%esp)call _atoimovl %eax, 28(%esp)movl 28(%esp), %eaxmovl %eax, 4(%esp)movl $LC0, (%esp)call _printfmovl $0, %eaxleaveret

12(%ebp) argv

8(%ebp) argc

4(%ebp) return addr

(%ebp) old %ebp

28(%esp) $67

24(%esp)

20(%esp)

16(%esp)

12(%esp)

8(%esp)

4(%esp) $67

(%esp) $LC0 %esp 28ff00 %ebp 28ff28 %eax $0

movl $1234, 28(%esp)movl 12(%ebp), %eaxaddl $4, %eaxmovl (%eax), %eaxmovl %eax, (%esp)call _atoimovl %eax, 28(%esp)movl 28(%esp), %eaxmovl %eax, 4(%esp)movl $LC0, (%esp)call _printfmovl $0, %eaxleaveret

12(%ebp) argv

8(%ebp) argc

4(%ebp) return addr

(%ebp) old %ebp

28(%esp) $67

24(%esp)

20(%esp)

16(%esp)

12(%esp)

8(%esp)

4(%esp) $67

(%esp) $LC0 %esp 28ff00 %ebp 28ff28 %eax $0

movl $1234, 28(%esp)movl 12(%ebp), %eaxaddl $4, %eaxmovl (%eax), %eaxmovl %eax, (%esp)call _atoimovl %eax, 28(%esp)movl 28(%esp), %eaxmovl %eax, 4(%esp)movl $LC0, (%esp)call _printfmovl $0, %eaxleaveret

8(%esp) argv

4(%esp) argc

(%esp) return addr

%esp 28ff2c %ebp old %ebp %eax $0

8(%esp) argv

4(%esp) argc

(%esp) return addr

%esp 28ff2c %ebp old %ebp %eax $0

movl $1234, 28(%esp)movl 12(%ebp), %eaxaddl $4, %eaxmovl (%eax), %eaxmovl %eax, (%esp)call _atoimovl %eax, 28(%esp)movl 28(%esp), %eaxmovl %eax, 4(%esp)movl $LC0, (%esp)call _printfmovl $0, %eaxleaveret

callingFunctions.SPassing arguments to functions via the stack

This presentation by Pat Hawks is licensed under aCreative Commons Attribution 4.0 International License


Recommended