본문 바로가기
코스웨어/10년 스마트폰BSP

[BSP]업무일지 - 김강수 20100929

by 알 수 없는 사용자 2010. 9. 30.
728x90
반응형
 #include <stdio.h>

 int main()

{

char A=0x7A; // 0b01111010

int B=A;

   

printf("%X\n", B);

   

A=0x8A; //0b10001010

B=A;

printf("%X\n", B);

}

   

   

▶ 부호확장

왜 위의 것은 1바이트만 출력되고, 아랫것은 4바이트가 출력될까
그것은 부호확장에 있다
 

char는 (signed)를 생략하고 있다. 그것을 (singed)int 대입하면 형병환이 일어난다.

   

0X7A 는 0b01111010 이다 1바이트에서 4바이트로 확장을 하면서 나머지 3바이트를 채우게 되는데,
이때 양수 인 것을 맞춰주기 위해 3바이트에 0을 넣는다
위의 그림에서도 출력은 7A가 되었지만 앞의 3바이트에 0이 들어간 것이다

0X8A 는 0b10001010 이다
이는 signed 에서 음수이기 때문에 부호를 맞춰주기 위해 앞의 3바이트에 1이 들어가서
위의 그림과 같이 FFFFFF8A 가 출력된 것이다
 


▶ 제로확장 : 위에서 unsinged 일 때 , 앞의 3바이트에 0을 채워 넣는 것이다.

   

==========================================================

   

Return Address

다음 코드처럼 main() 에서 다른 함수를 호출하였을 때 그림과 같은 일이 스택에서 일어난다
 

void test()

{

  int bb = 200;

  printf("test\n");

}

   

int main()

{

  int aa = 100;

  test();

  printf("main\n");

   

  return 0;

}

   


이렇게 되어서 test()가 실행되고 나면 main()으로 돌아올 때 돌아오는 참조하는 위치가
Return Address이다 . 그럼 return address(R.A)를 변경하면 어떻게 될까?
 

   

#include <stdio.h>

#include <stdlib.h>

   

void test2()

{

  printf("test2\n");

}

   void test()

{

  int aa=0;

  int *bb = &aa +2;

  *bb = (int)test2;

  printf("test\n");

}

   int main()

{

  int aa=100;

  test();

  printf("main\n");

   

  return 0;

}

     

  1. wowlinux ( gcc version : 2.95.4 )

       


    이렇게 되었다 위와 같은 결과가 나오는 이유를 알아보자

    실행을 하면 아래 그림과 같이 된다
     

       여기서 bb에는 &aa+ 2의 주소가 들어있는데 bb는 아래와 같다
    aa의 주소에서 aa크기만큼 2번 가게 되는 것이니깐
     


    R.A가 있는 곳을 가리키게 된다

     *bb = (int)test2;
    자리에 test2() 의 주소를 넣게 된다.

    이제 test()함수를 종료하고 return 할려 할 때 return address 위치에 test2()의 주소가 있으므로
    test()함수가 실행되어
     printf("test2\n"); 실행되고,
    return address가 없어졌으므로 , 에러가 발생하게 된다

728x90