callingFunctions.S
Passing arguments to functions via the stack
LC0:
.ascii "The argument was %d120"
.text
.globl _main
.def _main; .scl 2; .type 32; .endef
_main:
pushl %ebp
movl %esp, %ebp
andl $-16, %esp
subl $32, %esp
call ___main
movl $1234, 28(%esp)
movl 12(%ebp), %eax
addl $4, %eax
8(%esp) argv
4(%esp) argc
(%esp) return addr
%esp 28ff2c %ebp old %ebp %eax $0
LC0:
.ascii "The argument was %d120"
.text
.globl _main
.def _main; .scl 2; .type 32; .endef
_main:
pushl %ebp
movl %esp, %ebp
andl $-16, %esp
subl $32, %esp
call ___main
movl $1234, 28(%esp)
movl 12(%ebp), %eax
addl $4, %eax
8(%esp) argv
4(%esp) argc
(%esp) return addr
%esp 28ff2c %ebp old %ebp %eax $0
LC0:
.ascii "The argument was %d120"
.text
.globl _main
.def _main; .scl 2; .type 32; .endef
_main:
pushl %ebp
movl %esp, %ebp
andl $-16, %esp
subl $32, %esp
call ___main
movl $1234, 28(%esp)
movl 12(%ebp), %eax
addl $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 %d120"
.text
.globl _main
.def _main; .scl 2; .type 32; .endef
_main:
pushl %ebp
movl %esp, %ebp
andl $-16, %esp
subl $32, %esp
call ___main
movl $1234, 28(%esp)
movl 12(%ebp), %eax
addl $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 %d120"
.text
.globl _main
.def _main; .scl 2; .type 32; .endef
_main:
pushl %ebp
movl %esp, %ebp
andl $-16, %esp
subl $32, %esp
call ___main
movl $1234, 28(%esp)
movl 12(%ebp), %eax
addl $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 %d120"
.text
.globl _main
.def _main; .scl 2; .type 32; .endef
_main:
pushl %ebp
movl %esp, %ebp
andl $-16, %esp
subl $32, %esp
call ___main
movl $1234, 28(%esp)
movl 12(%ebp), %eax
addl $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 %d120"
.text
.globl _main
.def _main; .scl 2; .type 32; .endef
_main:
pushl %ebp
movl %esp, %ebp
andl $-16, %esp
subl $32, %esp
call ___main
movl $1234, 28(%esp)
movl 12(%ebp), %eax
addl $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 %d120"
.text
.globl _main
.def _main; .scl 2; .type 32; .endef
_main:
pushl %ebp
movl %esp, %ebp
andl $-16, %esp
subl $32, %esp
call ___main
movl $1234, 28(%esp)
movl 12(%ebp), %eax
addl $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 %d120"
.text
.globl _main
.def _main; .scl 2; .type 32; .endef
_main:
pushl %ebp
movl %esp, %ebp
andl $-16, %esp
subl $32, %esp
call ___main
movl $1234, 28(%esp)
movl 12(%ebp), %eax
addl $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 %d120"
.text
.globl _main
.def _main; .scl 2; .type 32; .endef
_main:
pushl %ebp
movl %esp, %ebp
andl $-16, %esp
subl $32, %esp
call ___main
movl $1234, 28(%esp)
movl 12(%ebp), %eax
addl $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 %d120"
.text
.globl _main
.def _main; .scl 2; .type 32; .endef
_main:
pushl %ebp
movl %esp, %ebp
andl $-16, %esp
subl $32, %esp
call ___main
movl $1234, 28(%esp)
movl 12(%ebp), %eax
addl $4, %eax
movl (%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 %d120"
.text
.globl _main
.def _main; .scl 2; .type 32; .endef
_main:
pushl %ebp
movl %esp, %ebp
andl $-16, %esp
subl $32, %esp
call ___main
movl $1234, 28(%esp)
movl 12(%ebp), %eax
addl $4, %eax
movl (%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 %ebp
movl %esp, %ebp
andl $-16, %esp
subl $32, %esp
call ___main
movl $1234, 28(%esp)
movl 12(%ebp), %eax
addl $4, %eax
movl (%eax), %eax
movl %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 %ebp
movl %esp, %ebp
andl $-16, %esp
subl $32, %esp
call ___main
movl $1234, 28(%esp)
movl 12(%ebp), %eax
addl $4, %eax
movl (%eax), %eax
movl %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 %ebp
movl %esp, %ebp
andl $-16, %esp
subl $32, %esp
call ___main
movl $1234, 28(%esp)
movl 12(%ebp), %eax
addl $4, %eax
movl (%eax), %eax
movl %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 of
pointer to
prog name
.globl _main
.def _main; .scl 2; .type 32; .endef
_main:
pushl %ebp
movl %esp, %ebp
andl $-16, %esp
subl $32, %esp
call ___main
movl $1234, 28(%esp)
movl 12(%ebp), %eax
addl $4, %eax
movl (%eax), %eax
movl %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 of
pointer to
prog name
.globl _main
.def _main; .scl 2; .type 32; .endef
_main:
pushl %ebp
movl %esp, %ebp
andl $-16, %esp
subl $32, %esp
call ___main
movl $1234, 28(%esp)
movl 12(%ebp), %eax
addl $4, %eax
movl (%eax), %eax
movl %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 of
pointer to
first arg
.def _main; .scl 2; .type 32; .endef
_main:
pushl %ebp
movl %esp, %ebp
andl $-16, %esp
subl $32, %esp
call ___main
movl $1234, 28(%esp)
movl 12(%ebp), %eax
addl $4, %eax
movl (%eax), %eax
movl %eax, (%esp)
call _atoi
movl %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 of
pointer to
first arg
.def _main; .scl 2; .type 32; .endef
_main:
pushl %ebp
movl %esp, %ebp
andl $-16, %esp
subl $32, %esp
call ___main
movl $1234, 28(%esp)
movl 12(%ebp), %eax
addl $4, %eax
movl (%eax), %eax
movl %eax, (%esp)
call _atoi
movl %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 to
first arg
_main:
pushl %ebp
movl %esp, %ebp
andl $-16, %esp
subl $32, %esp
call ___main
movl $1234, 28(%esp)
movl 12(%ebp), %eax
addl $4, %eax
movl (%eax), %eax
movl %eax, (%esp)
call _atoi
movl %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 %ebp
movl %esp, %ebp
andl $-16, %esp
subl $32, %esp
call ___main
movl $1234, 28(%esp)
movl 12(%ebp), %eax
addl $4, %eax
movl (%eax), %eax
movl %eax, (%esp)
call _atoi
movl %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 %ebp
movl %esp, %ebp
andl $-16, %esp
subl $32, %esp
call ___main
movl $1234, 28(%esp)
movl 12(%ebp), %eax
addl $4, %eax
movl (%eax), %eax
movl %eax, (%esp)
call _atoi
movl %eax, 28(%esp)
movl 28(%esp), %eax
For our purposes
argv[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 %ebp
movl %esp, %ebp
andl $-16, %esp
subl $32, %esp
call ___main
movl $1234, 28(%esp)
movl 12(%ebp), %eax
addl $4, %eax
movl (%eax), %eax
movl %eax, (%esp)
call _atoi
movl %eax, 28(%esp)
movl 28(%esp), %eax
movl %eax, 4(%esp)
For our purposes
argv[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 %ebp
movl %esp, %ebp
andl $-16, %esp
subl $32, %esp
call ___main
movl $1234, 28(%esp)
movl 12(%ebp), %eax
addl $4, %eax
movl (%eax), %eax
movl %eax, (%esp)
call _atoi
movl %eax, 28(%esp)
movl 28(%esp), %eax
movl %eax, 4(%esp)
For our purposes
argv[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 %ebp
movl %esp, %ebp
andl $-16, %esp
subl $32, %esp
call ___main
movl $1234, 28(%esp)
movl 12(%ebp), %eax
addl $4, %eax
movl (%eax), %eax
movl %eax, (%esp)
call _atoi
movl %eax, 28(%esp)
movl 28(%esp), %eax
movl %eax, 4(%esp)
For our purposes
argv[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, %ebp
andl $-16, %esp
subl $32, %esp
call ___main
movl $1234, 28(%esp)
movl 12(%ebp), %eax
addl $4, %eax
movl (%eax), %eax
movl %eax, (%esp)
call _atoi
movl %eax, 28(%esp)
movl 28(%esp), %eax
movl %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, %ebp
andl $-16, %esp
subl $32, %esp
call ___main
movl $1234, 28(%esp)
movl 12(%ebp), %eax
addl $4, %eax
movl (%eax), %eax
movl %eax, (%esp)
call _atoi
movl %eax, 28(%esp)
movl 28(%esp), %eax
movl %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, %esp
subl $32, %esp
call ___main
movl $1234, 28(%esp)
movl 12(%ebp), %eax
addl $4, %eax
movl (%eax), %eax
movl %eax, (%esp)
call _atoi
movl %eax, 28(%esp)
movl 28(%esp), %eax
movl %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, %esp
call ___main
movl $1234, 28(%esp)
movl 12(%ebp), %eax
addl $4, %eax
movl (%eax), %eax
movl %eax, (%esp)
call _atoi
movl %eax, 28(%esp)
movl 28(%esp), %eax
movl %eax, 4(%esp)
movl $LC0, (%esp)
call _printf
movl $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, %esp
call ___main
movl $1234, 28(%esp)
movl 12(%ebp), %eax
addl $4, %eax
movl (%eax), %eax
movl %eax, (%esp)
call _atoi
movl %eax, 28(%esp)
movl 28(%esp), %eax
movl %eax, 4(%esp)
movl $LC0, (%esp)
call _printf
movl $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 ___main
movl $1234, 28(%esp)
movl 12(%ebp), %eax
addl $4, %eax
movl (%eax), %eax
movl %eax, (%esp)
call _atoi
movl %eax, 28(%esp)
movl 28(%esp), %eax
movl %eax, 4(%esp)
movl $LC0, (%esp)
call _printf
movl $0, %eax
leave
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 ___main
movl $1234, 28(%esp)
movl 12(%ebp), %eax
addl $4, %eax
movl (%eax), %eax
movl %eax, (%esp)
call _atoi
movl %eax, 28(%esp)
movl 28(%esp), %eax
movl %eax, 4(%esp)
movl $LC0, (%esp)
call _printf
movl $0, %eax
leave
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 ___main
movl $1234, 28(%esp)
movl 12(%ebp), %eax
addl $4, %eax
movl (%eax), %eax
movl %eax, (%esp)
call _atoi
movl %eax, 28(%esp)
movl 28(%esp), %eax
movl %eax, 4(%esp)
movl $LC0, (%esp)
call _printf
movl $0, %eax
leave
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 memory
of our format string.
"The argument was %d120"
%esp 28ff00 %ebp 28ff28 %eax $67
movl $1234, 28(%esp)
movl 12(%ebp), %eax
addl $4, %eax
movl (%eax), %eax
movl %eax, (%esp)
call _atoi
movl %eax, 28(%esp)
movl 28(%esp), %eax
movl %eax, 4(%esp)
movl $LC0, (%esp)
call _printf
movl $0, %eax
leave
ret
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 memory
of our format string.
"The argument was %d120"
movl $1234, 28(%esp)
movl 12(%ebp), %eax
addl $4, %eax
movl (%eax), %eax
movl %eax, (%esp)
call _atoi
movl %eax, 28(%esp)
movl 28(%esp), %eax
movl %eax, 4(%esp)
movl $LC0, (%esp)
call _printf
movl $0, %eax
leave
ret
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), %eax
addl $4, %eax
movl (%eax), %eax
movl %eax, (%esp)
call _atoi
movl %eax, 28(%esp)
movl 28(%esp), %eax
movl %eax, 4(%esp)
movl $LC0, (%esp)
call _printf
movl $0, %eax
leave
ret
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), %eax
addl $4, %eax
movl (%eax), %eax
movl %eax, (%esp)
call _atoi
movl %eax, 28(%esp)
movl 28(%esp), %eax
movl %eax, 4(%esp)
movl $LC0, (%esp)
call _printf
movl $0, %eax
leave
ret
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), %eax
addl $4, %eax
movl (%eax), %eax
movl %eax, (%esp)
call _atoi
movl %eax, 28(%esp)
movl 28(%esp), %eax
movl %eax, 4(%esp)
movl $LC0, (%esp)
call _printf
movl $0, %eax
leave
ret
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), %eax
addl $4, %eax
movl (%eax), %eax
movl %eax, (%esp)
call _atoi
movl %eax, 28(%esp)
movl 28(%esp), %eax
movl %eax, 4(%esp)
movl $LC0, (%esp)
call _printf
movl $0, %eax
leave
ret
callingFunctions.S
Passing arguments to functions via the stack
This presentation by Pat Hawks is licensed under a
Creative Commons Attribution 4.0 International License

Calling Functions

  • 1.
  • 2.
    LC0: .ascii "The argumentwas %d120" .text .globl _main .def _main; .scl 2; .type 32; .endef _main: pushl %ebp movl %esp, %ebp andl $-16, %esp subl $32, %esp call ___main movl $1234, 28(%esp) movl 12(%ebp), %eax addl $4, %eax 8(%esp) argv 4(%esp) argc (%esp) return addr %esp 28ff2c %ebp old %ebp %eax $0
  • 3.
    LC0: .ascii "The argumentwas %d120" .text .globl _main .def _main; .scl 2; .type 32; .endef _main: pushl %ebp movl %esp, %ebp andl $-16, %esp subl $32, %esp call ___main movl $1234, 28(%esp) movl 12(%ebp), %eax addl $4, %eax 8(%esp) argv 4(%esp) argc (%esp) return addr %esp 28ff2c %ebp old %ebp %eax $0
  • 4.
    LC0: .ascii "The argumentwas %d120" .text .globl _main .def _main; .scl 2; .type 32; .endef _main: pushl %ebp movl %esp, %ebp andl $-16, %esp subl $32, %esp call ___main movl $1234, 28(%esp) movl 12(%ebp), %eax addl $4, %eax 12(%esp) argv 8(%esp) argc 4(%esp) return addr (%esp) old %ebp %esp 28ff28 %ebp old %ebp %eax $0
  • 5.
    LC0: .ascii "The argumentwas %d120" .text .globl _main .def _main; .scl 2; .type 32; .endef _main: pushl %ebp movl %esp, %ebp andl $-16, %esp subl $32, %esp call ___main movl $1234, 28(%esp) movl 12(%ebp), %eax addl $4, %eax 12(%esp) argv 8(%esp) argc 4(%esp) return addr (%esp) old %ebp %esp 28ff28 %ebp old %ebp %eax $0
  • 6.
    LC0: .ascii "The argumentwas %d120" .text .globl _main .def _main; .scl 2; .type 32; .endef _main: pushl %ebp movl %esp, %ebp andl $-16, %esp subl $32, %esp call ___main movl $1234, 28(%esp) movl 12(%ebp), %eax addl $4, %eax 12(%ebp) argv 8(%ebp) argc 4(%ebp) return addr (%ebp) old %ebp %esp 28ff28 %ebp 28ff28 %eax $0
  • 7.
    LC0: .ascii "The argumentwas %d120" .text .globl _main .def _main; .scl 2; .type 32; .endef _main: pushl %ebp movl %esp, %ebp andl $-16, %esp subl $32, %esp call ___main movl $1234, 28(%esp) movl 12(%ebp), %eax addl $4, %eax 12(%ebp) argv 8(%ebp) argc 4(%ebp) return addr (%ebp) old %ebp %esp 28ff28 %ebp 28ff28 %eax $0
  • 8.
    LC0: .ascii "The argumentwas %d120" .text .globl _main .def _main; .scl 2; .type 32; .endef _main: pushl %ebp movl %esp, %ebp andl $-16, %esp subl $32, %esp call ___main movl $1234, 28(%esp) movl 12(%ebp), %eax addl $4, %eax 12(%ebp) argv 8(%ebp) argc 4(%ebp) return addr (%ebp) old %ebp %esp 28ff20 %ebp 28ff28 %eax $0
  • 9.
    LC0: .ascii "The argumentwas %d120" .text .globl _main .def _main; .scl 2; .type 32; .endef _main: pushl %ebp movl %esp, %ebp andl $-16, %esp subl $32, %esp call ___main movl $1234, 28(%esp) movl 12(%ebp), %eax addl $4, %eax 12(%ebp) argv 8(%ebp) argc 4(%ebp) return addr (%ebp) old %ebp %esp 28ff20 %ebp 28ff28 %eax $0
  • 10.
    LC0: .ascii "The argumentwas %d120" .text .globl _main .def _main; .scl 2; .type 32; .endef _main: pushl %ebp movl %esp, %ebp andl $-16, %esp subl $32, %esp call ___main movl $1234, 28(%esp) movl 12(%ebp), %eax addl $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
  • 11.
    LC0: .ascii "The argumentwas %d120" .text .globl _main .def _main; .scl 2; .type 32; .endef _main: pushl %ebp movl %esp, %ebp andl $-16, %esp subl $32, %esp call ___main movl $1234, 28(%esp) movl 12(%ebp), %eax addl $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
  • 12.
    .ascii "The argumentwas %d120" .text .globl _main .def _main; .scl 2; .type 32; .endef _main: pushl %ebp movl %esp, %ebp andl $-16, %esp subl $32, %esp call ___main movl $1234, 28(%esp) movl 12(%ebp), %eax addl $4, %eax movl (%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
  • 13.
    .ascii "The argumentwas %d120" .text .globl _main .def _main; .scl 2; .type 32; .endef _main: pushl %ebp movl %esp, %ebp andl $-16, %esp subl $32, %esp call ___main movl $1234, 28(%esp) movl 12(%ebp), %eax addl $4, %eax movl (%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
  • 14.
    .text .globl _main .def _main;.scl 2; .type 32; .endef _main: pushl %ebp movl %esp, %ebp andl $-16, %esp subl $32, %esp call ___main movl $1234, 28(%esp) movl 12(%ebp), %eax addl $4, %eax movl (%eax), %eax movl %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
  • 15.
    .text .globl _main .def _main;.scl 2; .type 32; .endef _main: pushl %ebp movl %esp, %ebp andl $-16, %esp subl $32, %esp call ___main movl $1234, 28(%esp) movl 12(%ebp), %eax addl $4, %eax movl (%eax), %eax movl %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
  • 16.
    .text .globl _main .def _main;.scl 2; .type 32; .endef _main: pushl %ebp movl %esp, %ebp andl $-16, %esp subl $32, %esp call ___main movl $1234, 28(%esp) movl 12(%ebp), %eax addl $4, %eax movl (%eax), %eax movl %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 of pointer to prog name
  • 17.
    .globl _main .def _main;.scl 2; .type 32; .endef _main: pushl %ebp movl %esp, %ebp andl $-16, %esp subl $32, %esp call ___main movl $1234, 28(%esp) movl 12(%ebp), %eax addl $4, %eax movl (%eax), %eax movl %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 of pointer to prog name
  • 18.
    .globl _main .def _main;.scl 2; .type 32; .endef _main: pushl %ebp movl %esp, %ebp andl $-16, %esp subl $32, %esp call ___main movl $1234, 28(%esp) movl 12(%ebp), %eax addl $4, %eax movl (%eax), %eax movl %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 of pointer to first arg
  • 19.
    .def _main; .scl2; .type 32; .endef _main: pushl %ebp movl %esp, %ebp andl $-16, %esp subl $32, %esp call ___main movl $1234, 28(%esp) movl 12(%ebp), %eax addl $4, %eax movl (%eax), %eax movl %eax, (%esp) call _atoi movl %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 of pointer to first arg
  • 20.
    .def _main; .scl2; .type 32; .endef _main: pushl %ebp movl %esp, %ebp andl $-16, %esp subl $32, %esp call ___main movl $1234, 28(%esp) movl 12(%ebp), %eax addl $4, %eax movl (%eax), %eax movl %eax, (%esp) call _atoi movl %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 to first arg
  • 21.
    _main: pushl %ebp movl %esp,%ebp andl $-16, %esp subl $32, %esp call ___main movl $1234, 28(%esp) movl 12(%ebp), %eax addl $4, %eax movl (%eax), %eax movl %eax, (%esp) call _atoi movl %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]
  • 22.
    _main: pushl %ebp movl %esp,%ebp andl $-16, %esp subl $32, %esp call ___main movl $1234, 28(%esp) movl 12(%ebp), %eax addl $4, %eax movl (%eax), %eax movl %eax, (%esp) call _atoi movl %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]
  • 23.
    _main: pushl %ebp movl %esp,%ebp andl $-16, %esp subl $32, %esp call ___main movl $1234, 28(%esp) movl 12(%ebp), %eax addl $4, %eax movl (%eax), %eax movl %eax, (%esp) call _atoi movl %eax, 28(%esp) movl 28(%esp), %eax For our purposes argv[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]
  • 24.
    pushl %ebp movl %esp,%ebp andl $-16, %esp subl $32, %esp call ___main movl $1234, 28(%esp) movl 12(%ebp), %eax addl $4, %eax movl (%eax), %eax movl %eax, (%esp) call _atoi movl %eax, 28(%esp) movl 28(%esp), %eax movl %eax, 4(%esp) For our purposes argv[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]
  • 25.
    pushl %ebp movl %esp,%ebp andl $-16, %esp subl $32, %esp call ___main movl $1234, 28(%esp) movl 12(%ebp), %eax addl $4, %eax movl (%eax), %eax movl %eax, (%esp) call _atoi movl %eax, 28(%esp) movl 28(%esp), %eax movl %eax, 4(%esp) For our purposes argv[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]
  • 26.
    pushl %ebp movl %esp,%ebp andl $-16, %esp subl $32, %esp call ___main movl $1234, 28(%esp) movl 12(%ebp), %eax addl $4, %eax movl (%eax), %eax movl %eax, (%esp) call _atoi movl %eax, 28(%esp) movl 28(%esp), %eax movl %eax, 4(%esp) For our purposes argv[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
  • 27.
    movl %esp, %ebp andl$-16, %esp subl $32, %esp call ___main movl $1234, 28(%esp) movl 12(%ebp), %eax addl $4, %eax movl (%eax), %eax movl %eax, (%esp) call _atoi movl %eax, 28(%esp) movl 28(%esp), %eax movl %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
  • 28.
    movl %esp, %ebp andl$-16, %esp subl $32, %esp call ___main movl $1234, 28(%esp) movl 12(%ebp), %eax addl $4, %eax movl (%eax), %eax movl %eax, (%esp) call _atoi movl %eax, 28(%esp) movl 28(%esp), %eax movl %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
  • 29.
    andl $-16, %esp subl$32, %esp call ___main movl $1234, 28(%esp) movl 12(%ebp), %eax addl $4, %eax movl (%eax), %eax movl %eax, (%esp) call _atoi movl %eax, 28(%esp) movl 28(%esp), %eax movl %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
  • 30.
    subl $32, %esp call___main movl $1234, 28(%esp) movl 12(%ebp), %eax addl $4, %eax movl (%eax), %eax movl %eax, (%esp) call _atoi movl %eax, 28(%esp) movl 28(%esp), %eax movl %eax, 4(%esp) movl $LC0, (%esp) call _printf movl $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
  • 31.
    subl $32, %esp call___main movl $1234, 28(%esp) movl 12(%ebp), %eax addl $4, %eax movl (%eax), %eax movl %eax, (%esp) call _atoi movl %eax, 28(%esp) movl 28(%esp), %eax movl %eax, 4(%esp) movl $LC0, (%esp) call _printf movl $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
  • 32.
    call ___main movl $1234,28(%esp) movl 12(%ebp), %eax addl $4, %eax movl (%eax), %eax movl %eax, (%esp) call _atoi movl %eax, 28(%esp) movl 28(%esp), %eax movl %eax, 4(%esp) movl $LC0, (%esp) call _printf movl $0, %eax leave 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
  • 33.
    call ___main movl $1234,28(%esp) movl 12(%ebp), %eax addl $4, %eax movl (%eax), %eax movl %eax, (%esp) call _atoi movl %eax, 28(%esp) movl 28(%esp), %eax movl %eax, 4(%esp) movl $LC0, (%esp) call _printf movl $0, %eax leave 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
  • 34.
    call ___main movl $1234,28(%esp) movl 12(%ebp), %eax addl $4, %eax movl (%eax), %eax movl %eax, (%esp) call _atoi movl %eax, 28(%esp) movl 28(%esp), %eax movl %eax, 4(%esp) movl $LC0, (%esp) call _printf movl $0, %eax leave 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 memory of our format string. "The argument was %d120" %esp 28ff00 %ebp 28ff28 %eax $67
  • 35.
    movl $1234, 28(%esp) movl12(%ebp), %eax addl $4, %eax movl (%eax), %eax movl %eax, (%esp) call _atoi movl %eax, 28(%esp) movl 28(%esp), %eax movl %eax, 4(%esp) movl $LC0, (%esp) call _printf movl $0, %eax leave ret 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 memory of our format string. "The argument was %d120"
  • 36.
    movl $1234, 28(%esp) movl12(%ebp), %eax addl $4, %eax movl (%eax), %eax movl %eax, (%esp) call _atoi movl %eax, 28(%esp) movl 28(%esp), %eax movl %eax, 4(%esp) movl $LC0, (%esp) call _printf movl $0, %eax leave ret 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
  • 37.
    movl $1234, 28(%esp) movl12(%ebp), %eax addl $4, %eax movl (%eax), %eax movl %eax, (%esp) call _atoi movl %eax, 28(%esp) movl 28(%esp), %eax movl %eax, 4(%esp) movl $LC0, (%esp) call _printf movl $0, %eax leave ret 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
  • 38.
    movl $1234, 28(%esp) movl12(%ebp), %eax addl $4, %eax movl (%eax), %eax movl %eax, (%esp) call _atoi movl %eax, 28(%esp) movl 28(%esp), %eax movl %eax, 4(%esp) movl $LC0, (%esp) call _printf movl $0, %eax leave ret 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
  • 39.
    movl $1234, 28(%esp) movl12(%ebp), %eax addl $4, %eax movl (%eax), %eax movl %eax, (%esp) call _atoi movl %eax, 28(%esp) movl 28(%esp), %eax movl %eax, 4(%esp) movl $LC0, (%esp) call _printf movl $0, %eax leave ret 8(%esp) argv 4(%esp) argc (%esp) return addr %esp 28ff2c %ebp old %ebp %eax $0
  • 40.
    8(%esp) argv 4(%esp) argc (%esp)return addr %esp 28ff2c %ebp old %ebp %eax $0 movl $1234, 28(%esp) movl 12(%ebp), %eax addl $4, %eax movl (%eax), %eax movl %eax, (%esp) call _atoi movl %eax, 28(%esp) movl 28(%esp), %eax movl %eax, 4(%esp) movl $LC0, (%esp) call _printf movl $0, %eax leave ret
  • 41.
    callingFunctions.S Passing arguments tofunctions via the stack This presentation by Pat Hawks is licensed under a Creative Commons Attribution 4.0 International License