=====================================================================
-- swap2.c --
#include <stdio.h>
int main()
{
int i = 3;
int j = 10;
{
int i = 5;
int j = 20;
}
printf("i = %d, j = %d \n", i , j);
return 0;
}
-- swap2.c --
-- 실행결과 --
# gcc -S -o swap2-att.s swap2.c
-- 실행결과 --
-- 어셈블리코드 --
.LC0:
.string "i = %d, j = %d \n"
.globl main
main:
pushl %ebp
movl %esp, %ebp
subl $28, %esp
movl $3, -16(%ebp)
movl $10, -12(%ebp)
movl $5, -8(%ebp)
movl $20, -4(%ebp)
movl -12(%ebp), %eax
movl %eax, 8(%esp)
movl -16(%ebp), %eax
movl %eax, 4(%esp)
movl $.LC0, (%esp)
call printf
movl $0, %eax
leave
ret
-- 어셈블리코드 --
-- 메모리 구조 --
| | High Memory
+-----------+ <-- ebp(고정)
| { j=20} |
+-----------+ -4
| { i=5 } |
+-----------+ -8
|main j=10 |
+-----------+ -12
|main i=3 |
+-----------+ -16
| j=10 |
+-----------+ -20 +8
|main i=3 |
+-----------+ -24 +4
| 문자열 |
+-----------+ <-- esp
| | Low Memory
-- 메모리 구조 --
=====================================================================
=====================================================================
-- swap3.c --
#include <stdio.h>
int main()
{
int i = 3;
int j = 10;
{
int i = 5;
int j = 20;
}
i++;
j++;
return 0;
}
-- swap3.c --
-- 어셈블리코드 --
.globl main
main:
pushl %ebp
movl %esp, %ebp
subl $16, %esp
movl $3, -16(%ebp)
movl $10, -12(%ebp)
movl $5, -8(%ebp)
movl $20, -4(%ebp)
addl $1, -16(%ebp)
addl $1, -12(%ebp)
movl $0, %eax
leave
ret
-- 어셈블리코드 --
-- 메모리구조 --
eax=
| | High Memory
+-----------+ <-- ebp(고정)
| { j=20 } |
+-----------+ -4 12
| { i=5 } |
+-----------+ -8 8
|main{j=10} |
+-----------+ -12 4
|main{i=3 } |
+-----------+ -16 0 <-- esp
| | Low Memory
i++;
j++;
eax=0
| | High Memory
+-----------+ <-- ebp(고정)
| { j=20 } |
+-----------+ -4 12
| { i=5 } |
+-----------+ -8 8
|main{j=11} | <-- j++
+-----------+ -12 4
|main{i=4 } | <-- i++
+-----------+ -16 0 <-- esp
| | Low Memory
-- 메모리구조 --
=====================================================================
=====================================================================
LAB> Call by Reference
-- pointer1.c --
#include <stdio.h>
int main()
{
int i;
int *p;
i = 10;
p = &i;
return 0;
}
-- pointer1.c --
-- 실행결과 --
# gcc -S -o pointer1-att.s pointer1.c
-- 실행결과 --
-- 어셈블리코드 --
.globl main
main:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
movl $10, -8(%ebp)
leal -8(%ebp), %eax
movl %eax, -4(%ebp)
movl $0, %eax
leave
ret
-- 어셈블리코드 --
-- 메모리구조 --
eax=0xbfff....
| | High Memory
+-----------+ <-- ebp(고정)
| 0xbfff..|
+-----------+ -4 4
| i=10 |
+-----------+ -8 0 <-- esp
| | Low Memory
-- 메모리구조 --
-- gdb 분석 --
# gcc -g -o pointer1 pointer1.c
# gdb -q pointer1
Reading symbols from /root/programming/c/pointer1...done.
(gdb) disas main
Dump of assembler code for function main:
0x08048374 <main+0>: push %ebp
0x08048375 <main+1>: mov %esp,%ebp
0x08048377 <main+3>: sub $0x8,%esp
0x0804837a <main+6>: movl $0xa,-0x8(%ebp)
0x08048381 <main+13>: lea -0x8(%ebp),%eax
0x08048384 <main+16>: mov %eax,-0x4(%ebp)
0x08048387 <main+19>: mov $0x0,%eax
0x0804838c <main+24>: leave
0x0804838d <main+25>: ret
End of assembler dump.
(gdb) b *0x08048374
Breakpoint 1 at 0x8048374: file pointer1.c, line 4.
(gdb) i b
Num Type Disp Enb Address What
1 breakpoint keep y 0x08048374 in main at pointer1.c:4
(gdb) r
Starting program: /root/programming/c/pointer1
Breakpoint 1, main () at pointer1.c:4
4 {
(gdb) display $ebp
1: $ebp = (void *) 0xbfffea58
(gdb) display $esp
2: $esp = (void *) 0xbfffe9fc
gdb) display $eip
3: $eip = (void (*)()) 0x8048374 <main>
(gdb) i dis
Auto-display expressions now in effect:
Num Enb Expression
3: y $eip
2: y $esp
1: y $ebp
(gdb) ni
0x08048375 4 {
3: $eip = (void (*)()) 0x8048375 <main+1>
2: $esp = (void *) 0xbfffe9f8
1: $ebp = (void *) 0xbfffea58
(gdb) ni
0x08048377 4 {
3: $eip = (void (*)()) 0x8048377 <main+3>
2: $esp = (void *) 0xbfffe9f8
1: $ebp = (void *) 0xbfffe9f8
(gdb) x/16xw $ebp
0xbfffe9f8: 0xbfffea58 0x0073aebc 0x00000001 0xbfffea84
0xbfffea08: 0xbfffea8c 0x00722828 0x00000000 0x00000001
0xbfffea18: 0x00000001 0x00000000 0x0087dff4 0x00721ca0
0xbfffea28: 0x00000000 0xbfffea58 0xb02a3975 0x0fa67df4
(gdb) ni
7 i = 10;
3: $eip = (void (*)()) 0x804837a <main+6>
2: $esp = (void *) 0xbfffe9f0
1: $ebp = (void *) 0xbfffe9f8
(gdb) disas main
Dump of assembler code for function main:
0x08048374 <main+0>: push %ebp
0x08048375 <main+1>: mov %esp,%ebp
0x08048377 <main+3>: sub $0x8,%esp
0x0804837a <main+6>: movl $0xa,-0x8(%ebp) <--
0x08048381 <main+13>: lea -0x8(%ebp),%eax
0x08048384 <main+16>: mov %eax,-0x4(%ebp)
0x08048387 <main+19>: mov $0x0,%eax
0x0804838c <main+24>: leave
0x0804838d <main+25>: ret
End of assembler dump.
(gdb) x/x $ebp-8
0xbfffe9f0: 0x00721ca0
(gdb) x/d $ebp-8
0xbfffe9f0: 7478432
(gdb) ni
8 p = &i;
3: $eip = (void (*)()) 0x8048381 <main+13>
2: $esp = (void *) 0xbfffe9f0
1: $ebp = (void *) 0xbfffe9f8
(gdb) x/x $ebp-8
0xbfffe9f0: 0x0000000a
(gdb) x/d $ebp-8
0xbfffe9f0: 10
(gdb) print &i
$1 = (int *) 0xbfffe9f0
(gdb) print &p
$2 = (int **) 0xbfffe9f4
(gdb) print p
$3 = (int *) 0x80483a0
(gdb) x/x $eax
0xbfffea84: 0xbfffeb9d
(gdb) ni
0x08048384 8 p = &i;
3: $eip = (void (*)()) 0x8048384 <main+16>
2: $esp = (void *) 0xbfffe9f0
1: $ebp = (void *) 0xbfffe9f8
(gdb) x/x $eax
0xbfffe9f0: 0x0000000a
(gdb) i r $eax
eax 0xbfffe9f0 -1073747472
(gdb) x/8xw $ebp
0xbfffe9f8: 0xbfffea58 0x0073aebc 0x00000001 0xbfffea84
0xbfffea08: 0xbfffea8c 0x00722828 0x00000000 0x00000001
(gdb) x/8xw $ebp-16
0xbfffe9e8: 0x00000000 0x0087dff4 0x0000000a 0xbfffe9f0
0xbfffe9f8: 0xbfffea58 0x0073aebc 0x00000001 0xbfffea84
(gdb) ni
10 }
3: $eip = (void (*)()) 0x804838c <main+24>
2: $esp = (void *) 0xbfffe9f0
1: $ebp = (void *) 0xbfffe9f8
(gdb) ni
0x0804838d in main () at pointer1.c:10
10 }
3: $eip = (void (*)()) 0x804838d <main+25>
2: $esp = (void *) 0xbfffe9fc
1: $ebp = (void *) 0xbfffea58
(gdb) ni
0x0073aebc in __libc_start_main () from /lib/libc.so.6 <--
3: $eip = (void (*)()) 0x73aebc <__libc_start_main+220>
2: $esp = (void *) 0xbfffea00
1: $ebp = (void *) 0xbfffea58
-- gdb 분석 --
-- 메모리구조 --
eax=0xbfffe9f0
| | High Memory
+-----------+ <-- old ebp (0xbfffea58)
| : |
| : |
| : |
+-----------+
| *envp | <-- 0xbfffea8c
+-----------+
| *argv | <-- 0xbfffea84
+-----------+
| argc | <-- 0x00000001
+-----------+
| RET | <-- 0x0073aebc
+-----------+
|0xbfffea58 |
+-----------+ <-- ebp e9f8
|0xbfffe9f0 |
+-----------+
| i=10 |
+-----------+ <-- esp e9f0
| | Low Memory
-- 메모리구조 --
=====================================================================