[디버깅]
(gdb) disas main
Dump of assembler code for function main:
0x8048430 <main>: push %ebp
0x8048431 <main+1>: mov %esp,%ebp //프롤로그
|SFP | RET |
↑ESP,EBP
0x8048433 <main+3>: sub $0x64,%esp// esp -100
| BUF[100]|SFP | RET |
↑ESP ↑EBP
0x8048436 <main+6>: push $0x80484c0 // PUTS의 문자열 INPUT :
0x804843b <main+11>: call 0x8048340 <puts> // PUTS()
0x8048440 <main+16>: add $0x4,%esp // CALLING CONVENTION
0x8048443 <main+19>: lea 0xffffff9c(%ebp),%eax // INPUT 값을 집어넣어주기위해 EAX 에다가 //EBP-100(buf[100] 앞부분) 을 집어넣어준다
| BUF[100]|SFP | RET |
↑ESP,EAX ↑EBP
0x8048446 <main+22>: push %eax // 옮겻으니 집어넣어줘야 되겟고
0x8048447 <main+23>: call 0x8048330 <gets>//gets() call
0x804844c <main+28>: add $0x4,%esp// CALLING CONVENTION
0x804844f <main+31>: lea 0xffffff9c(%ebp),%eax// input값을 집어넣어준다 .
0x8048452 <main+34>: push %eax // input value
0x8048453 <main+35>: push $0x80484c8// 문자열
0x8048458 <main+40>: call 0x8048370 <printf> // printf() call
0x804845d <main+45>: add $0x8,%esp // 문자열과 input 값을 집어넣기위해 사용한 str형식문자열을 반환 , 마찬가지로calling convention
0x8048460 <main+48>: xor %eax,%eax // eax 초기화
0x8048462 <main+50>: jmp 0x8048464 <main+52> // 딱히 jump 가 나올필요가 없다고 생각을하는데 왜 여기에 jmp문이존재할까?
0x8048464 <main+52>: leave // 에필로그
0x8048465 <main+53>: ret
------------------------------------------------------------------------------------
V.S
------------------------------------------------------------------------------------
[scanf() 소스] int main(void)
{
char str[100];
puts("input:\n");
scanf("%s",&str); //간단하게 GETS()에서 SCANF()로 바꿔주었다 SCANF 는 GETS()와는달리 스페이스바가 입력되기전까지 입력받는다 HELLO WORLD 하면 HELLO 이후는 짤려짐
printf("output : %s.\n", str);
return 0;
}
[디버깅 ]
(gdb) disas main
Dump of assembler code for function main:
0x8048430 <main>: push %ebp
0x8048431 <main+1>: mov %esp,%ebp // 프롤로그
0x8048433 <main+3>: sub $0x64,%esp // esp -100
|buf [100] | SFP | RET
↑ESP ↑EBP
0x8048436 <main+6>: push $0x80484d0 // PUTS'S STRING
0x804843b <main+11>: call 0x8048330 <puts> // PUTS CALL
0x8048440 <main+16>: add $0x4,%esp //CALLING CONVENTION
0x8048443 <main+19>: lea 0xffffff9c(%ebp),%eax // EBP -100 (BUF[100]부분을 EAX에 넣어준다 )
0x8048446 <main+22>: push %eax // PUSH
0x8048447 <main+23>: push $0x80484d8// 형식문자열
0x804844c <main+28>: call 0x8048340 <scanf> //SCANF CALL
0x8048451 <main+33>: add $0x8,%esp//CALLING CONVENTION
0x8048454 <main+36>: lea 0xffffff9c(%ebp),%eax // 입력받은것을 다시 EAX로
0x8048457 <main+39>: push %eax// PUSH
0x8048458 <main+40>: push $0x80484db // STR
0x804845d <main+45>: call 0x8048370 <printf> // PRINTF() CALL
0x8048462 <main+50>: add $0x8,%esp //CALLING CONVENTION
0x8048465 <main+53>: xor %eax,%eax // EAX 초기화
0x8048467 <main+55>: jmp 0x8048470 <main+64> // 여기도 마찬가지로 JMP 문이생긴다
0x8048469 <main+57>: lea 0x0(%esi,1),%esi // SCANF는 GETS()와는 달리 이런 부분이 생겻는데왜생겻지 ;
0x8048470 <main+64>: leave //에필로그
0x8048471 <main+65>: ret
'과거의 컴퓨터 공부 > C 디버깅' 카테고리의 다른 글
exec() v.s fork () (0) | 2014.09.22 |
---|---|
fflush() (0) | 2014.09.20 |
if else (0) | 2014.09.19 |
for() (0) | 2014.09.19 |
main함수 옆에 파라메터 넣어보기 (0) | 2014.09.18 |