[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 |