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;
}
-
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가 없어졌으므로 , 에러가 발생하게 된다
'코스웨어 > 10년 스마트폰BSP' 카테고리의 다른 글
[BSP]업무일지-서동준-20101004 (0) | 2010.10.04 |
---|---|
리눅스 커널 프로그래밍 - 커널 내부 제어 방법 (Micro software 2006.7) by.국중진 (2) | 2010.10.04 |
[BSP]업무일지-김상식-20101002 (0) | 2010.10.04 |
[BSP]20100930-임종현 (0) | 2010.09.30 |
리눅스 커널 함수 호출 과정 (0) | 2010.09.30 |
[BSP]업무일지-이도헌-2010 0928 (0) | 2010.09.28 |
[BSP]업무일지-서유해-20100927 (0) | 2010.09.28 |
[BSP]업무일지-김석희-20100924 (0) | 2010.09.24 |