반응형


[source]

#include <stdio.h>


int main(int a){

a=3;

}

int main 옆에 존재하는 파라메터는 엄연히 '전역변수다' 

확인해보자 

[디버깅]

(gdb) disas main

Dump of assembler code for function main:

0x8048398 <main>: push   %ebp

0x8048399 <main+1>: mov    %esp,%ebp

0x804839b <main+3>: movl   $0x3,0x8(%ebp)

0x80483a2 <main+10>: leave  

역시 전역변수 여서 그런지 main 스택상에 보이지 않는다 헌데 특별한점이있다면, 굵은부분으로 표시한 main+3  부분이다 . 잘보면 3을 ebp +8 부분에 집어넣어 주고 있다. 이부분은 어디일까? 


[break]

eip &0x8048398:     0xbffffb6c(esp)

eip &0x8048399 : SFP생성뒤 직전 ebp : 0xbffffb88(SFP)  esp: 0xbffffb68 (6c-4)

eip &0x804839b : ebp : 0xbffffb68 esp: 0xbffffb68 (같아진다) 

eip &0x8048a2 : ebp :0xbffffb68 esp :0xbffffb

eip &0x8048a


[스택의 상황 ]

push ebp (SFP생성)     |SFP |RET


mov esp ,ebp             |SFP(ESP,EBP) | RET


movl 0x3,0x8(%ebp)       |SFP(ESP)| RET | 3(int a)


이런식으로 된다. 따라서 intger a의 값은  환경변수|스택|데이터|코드 중 데이터영역중에 .bss영역에 들어갈것이다(왜냐하면 .data영역의 경우에는 전역변수가 초기화(값이 설정)됫을떄에 들어가게 되고.bss 는 초기화 되지않은 값이 들어간다 )



반응형

'과거의 컴퓨터 공부 > C 디버깅' 카테고리의 다른 글

fflush()  (0) 2014.09.20
gets() v.s scanf()  (0) 2014.09.20
if else  (0) 2014.09.19
for()  (0) 2014.09.19
변수, printf 디버깅  (0) 2014.09.17
,