Linux/C
Call by Reference
HoyoungEE
2015. 6. 1. 15:14
===================================================================== -- 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 -- 메모리구조 -- =====================================================================