본문 바로가기

Linux/C

Call by Reference

=====================================================================
-- 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
-- 메모리구조 --
=====================================================================


'Linux > C' 카테고리의 다른 글

[linux] 포인터#3  (0) 2015.05.14
[linux] 포인터#2  (0) 2015.05.13
[linux] 포인터#1  (0) 2015.05.12
[linux] 명령행 인자를 이용한 프로그램 실행  (0) 2015.05.11
[linux] 반복문( while )  (0) 2015.05.11