본문 바로가기

Daily Report

110617 문자열처리함수2(strtok,토큰) / 어셈블리 변수선언 및 자료형 처리


문자열 처리함수 // 문장을 배열에 단어별로 저장하여 각각 출력하기2_다른예제

 

/*   strtok   */

 

char Text[] = This is a ATMega;

 

char*p;

p = strtok(Text, );  //strtok 공백을 찾는다

while(NULL != p)

{

             printf(p); - printf(%s\n,p);

             printf(\n);

             p = strtok(NULL, );  //공백에서 시작해서 다음 공백까지 찾는다

}

 

const 참고

1) const char *p = test;  //p를 사용해서 test 수정하지 않겠다

2) const char *p = test;  //p test를 가리키는 것을 수정하지 않겠다

3) const char * const p = test; 둘다 수정하지 않겠다

 

const char * 글자 자체를 수정하지 않기 위해서 사용한다

 

ex)printf(test\n);

        =const char *

 

가리키는 영역 표시

 

int main()

{

char *Text = This is a ATMega;

char Text[] = This is a ATMega;

 

printf(코드영역 : %08x\n, Text1);    //코드영역의 주소를 출력한다

printf(스택영역 : %08x\n, Text2);    //스택영역의 주소를 출력한다

             return 0;

}


어셈블리) stack
의 변수선언 및 자료형 처리


char a = 100;

int b; 를 선언합니다

 

sub esp,44h - 68(10진수) / 4 = 17 stack 할당

 

byte ptr [ebp-4],64h 100(10진수) / 4 = 25 stack 할당

여기서 int b = 100; 100 b에 넣게되면

mov dword ptr[ebp-8],64h stack할당

 

*시작시 컴파일러는 한꺼번에 선언된 변수를 stack에 생성한다 그래서 제일 첫부분에 항성 변수를 선언하는 것도 이러한 이유 때문이다

 

a = -1;

 

mov byte ptr[ebp-4],0FFh(1 2의보수 : 음수)

 

b = a;

 

movsx eax ,byte ptr[ebp-4]

mov dword ptr[ebp-8],eax

 

2줄로 할당되게 되는데 movsx에서 s = signed x=extent(4byte)를 뜻합니다

 

변수 앞에 unsigned를 넣게되면 (unsigned int a)

 

mov eax, dword ptr[ebp-4]

and eax, 0FFh

mov dword ptr[ebp-8],eax


3
줄이 나오게되는데 이말은 char 형의 값을 int형으로 and연산 한다라는 것을 뜻합니다


##

##

##

FF

  

 

   00          00          00          FF             and 연산

   00          00          00          FF              결과값

 

쓰레기 값을 and연산으로 채워 넣게됩니다