반응형
gets() 함수
- 1줄을 입력할 때는 gets() 함수를 사용한다.
- 줄 바꿈(엔터)키를 입력할때까지 1줄을 그대로 읽어들인다.
- 읽어들인 문자열은 줄 바꿈 하는 곳에서 \0이 붙여진 배열에 저장됩니다.
참고( http://lechocolat.egloos.com/viewer/441439) 

[gets source ] 

#include<stdio.h>

int main(void)
{
char str[100];
puts("input:\n");
gets(str);
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 //프롤로그 

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