반응형

[if source ]

#include <stdio.h>


int main(){

int i;

printf("input :\n")


scanf("%d",&i);

if(i==7){

printf("Yes!!\n");

}

return 0;

}

else를 추가하지 않은상태다 

[debugging]

Dump of assembler code for function main:

0x8048400 <main>: push   %ebp

0x8048401 <main+1>: mov    %esp,%ebp//프롤로그 

|int i | SFP |RET | a==7

       ↑esp,ebp

0x8048403 <main+3>: sub    $0x4,%esp // int i를 로컬로 선언햇기때문에 이처럼4를 뺴줫다 

|int i           | SFP |RET |

↑esp          ↑ebp

0x8048406 <main+6>: push   $0x80484a0 // input: 이라는 문자열을 꺼내온다 

0x804840b <main+11>: call   0x804833c <printf> // printf() call  진행상황 : int i 가 선언되었고, printf("input:"\n");까지 나온상태 

0x8048410 <main+16>: add    $0x4,%esp // int  i에 값이들올것이므로 esp 가 다시 4 상승하게 된다 

|int i          | SFP |RET | a==7

                 ↑esp,ebp

0x8048413 <main+19>: lea    0xfffffffc(%ebp),%eax // ebp-4부분(ret)를 eax에 넣어준다 

|int i(scanf) | SFP         | RET | 

↑eax          ↑esp,ebp    

0x8048416 <main+22>: push   %eax // eax가 가리키는 부분을 집어넣는다 

0x8048417<main+23>: push   $0x80484a9 //scanf 의 %d 부분이될것이다 

0x804841c <main+28>: call   0x804830c <scanf> //scanf call //입력받는다 

0x8048421 <main+33>: add    $0x8,%esp// calling convention

0x8048424 <main+36>: cmpl   $0x7,0xfffffffc(%ebp) //0x7 과 ebp -4(input값)를 비교한다 

0x8048428 <main+40>: jne    0x8048437 <main+55> //비교햇을때와 같지않을경우  에필로그로 점프해서 종료한다 

0x804842a <main+42>: push   $0x80484ac // 문자열 Yes ! 

0x804842f <main+47>: call   0x804833c <printf>// printf () call 

0x8048434 <main+52>: add    $0x4,%esp//calling convetion 

0x8048437 <main+55>: xor    %eax,%eax //eax의 초기화 

0x8048439 <main+57>: jmp    0x8048440 <main+64> // 에필로로 점프 

0x804843b <main+59>: nop    

0x804843c <main+60>: lea    0x0(%esi,1),%esi // NOP보다 빠른 NOP 인데 if 문을사용하면 if 문이끝난뒤에 NOP와 lea 0x0 ... 이생기나보다 for 문같은경우는 앞뒤로 lea ... 이생겻는데 왜이런지는 다음주에 가서 물어봐야겟다 

0x8048440 <main+64>: leave   // 에필로그 

0x8048441 <main+65>: ret 


[if else source ]// 위의 소스에다가 추가하엿음

 int main(){

int i;

printf("input :\n");

scanf("%d",&i);

if(i==7){

printf("Yes!!\n");

}


else{

printf("noph!\n");}

return 0;

}

[debugging]

Dump of assembler code for function main:

0x8048400 <main>: push   %ebp

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

0x8048403 <main+3>: sub    $0x4,%esp

0x8048406 <main+6>: push   $0x80484b0

0x804840b <main+11>: call   0x804833c <printf>

0x8048410 <main+16>: add    $0x4,%esp

0x8048413 <main+19>: lea    0xfffffffc(%ebp),%eax

0x8048416 <main+22>: push   %eax

0x8048417 <main+23>: push   $0x80484b9

0x804841c <main+28>: call   0x804830c <scanf>

0x8048421 <main+33>: add    $0x8,%esp //calling convention 

0x8048424 <main+36>: cmpl   $0x7,0xfffffffc(%ebp)

0x8048428 <main+40>: jne    0x8048440 <main+64>

0x804842a <main+42>: push   $0x80484bc

0x804842f <main+47>: call   0x804833c <printf>

0x8048434 <main+52>: add    $0x4,%esp//calling convention

0x8048437 <main+55>: jmp    0x804844d <main+77>

0x8048439 <main+57>: lea    0x0(%esi,1),%esi

0x8048440 <main+64>: push   $0x80484c3

0x8048445 <main+69>: call   0x804833c <printf> // else문이 추가되었다 

0x804844a <main+74>: add    $0x4,%esp // calling convetion 

0x804844d <main+77>: xor    %eax,%eax

---Type <return> to continue, or q <return> to quit---

0x804844f <main+79>: jmp    0x8048451 <main+81>

반응형

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

fflush()  (0) 2014.09.20
gets() v.s scanf()  (0) 2014.09.20
for()  (0) 2014.09.19
main함수 옆에 파라메터 넣어보기  (0) 2014.09.18
변수, printf 디버깅  (0) 2014.09.17
,