컴퓨터공부 362

ARM FAQ - 정렬/정렬안 된 (Aligned/Unaligned) 엑세스및 __packed 사용

▷ 서론 다른 RISC 구조처럼, ARM 프로세스는 '정렬된 데이터' 즉 4의 배수의 주소에 있는 워드(word or fullword : 4바이트) 와 2의 배수에 있는 반워드(halfword : 2바이트) 를 효율적으로 엑세스하도록 설계되었다. 그런 데이터들은 자연 크기 경계(natural size boundary)에 존재한다고 한다. !) 번역시 워드는 전단어로 반워드는 반단어로 사용하기도 한다. ARM 컴파일러는 보통 LDR/STR 명령어를 이용 효율적인 데이터 엑세스를 가능하도록 자연 크기 경계에 전역 변수들을 정렬시킨다. 이것은 대부분의 CISC 아키텍쳐들에서 명령어가 '정렬되지 않은 데이터'를 직접적으로 엑세스 가능한 것과는 상반된 것으로, '정렬되지 않은 데이터'를 엑세스하는 기존 코드(le..

컴퓨터공부 2009.02.23

__packed 키워드

__packed 지시어는 컴파일러에게 데이터들이 바이트 단위로 위치해 있다고 알려줍니다. 구조체 에서 __packed 지시자는 모든 패딩값을 제거하기 위해 사용됩니다. struct { char a; int b; short c; char d; } 위 코드의 경우 리틀엔디안 메모리 시스템에서 아래와 같이 패딩 비트가 들어가게 됩니다. 주소 +3 +2 +1 +0 +-----------+-----------+-----------+-----------+ +0 | pad | pad | pad | a | +-----------+-----------+-----------+-----------+ +4 | b[31, 24] | b[23, 16] | b[15, 8] | b[7, 0] | +-----------+-------..

컴퓨터공부 2009.02.23

wireshark 사용법

[머리글] 이 사용법은 제가 작성한 글이 아닙니다.출처는 정확히 기억이 안나서 적지 못하였습니다.우선 본글을 기고하신분에게 감사드리며 정보를 모든분들과 나누고 싶습니다.좋은 하루들 되세요. 이번에는 여러분들이 패킷을 수집하는데 있어서 가장 많이 사용되는 wireshark (ethereal)에 대해서 알아보도록 하겠습니다. 일단 이름이 wireshark가 된 이유에 대해서 간단하게 짚고 넘어가야 하겠네요. 많은 분들께서 아직도 Ethereal이라는 용어에 익숙하실 것으로 알고 있습니다. 그러나 이름이 wireshark로 변경되게 된 이유는 ethereal 개발자가 회사를 옮기게 되면서 그렇게 된 것이지요. Wireshark라는 이름은 2006년 5월에 Gerald Combs라는 ethereal 오리지날 개..

컴퓨터공부 2009.02.14

assembly in visual stdio 6.0 and .net

오늘 교육을 듣다가 아주 괜찮은 것을 알게 되어서 바로 포스팅을 한다. 비주얼 스튜디오에서 assembly code를 생성하는 것이다. 1. Menu -> Build -> Set Activie Project Configuration -> Win32 Release 선택 2. Menu -> Project -> C/C++ tab -> Category : General -> Optimizations : Customize -> OK 3. Menu -> Project -> C/C++ tab -> Category : Listing Files -> OK 4. Compile 5. See the Release folder 6. Open XX.asm 7. Enjoy 다음과 같이 코드를 작성 했을 경우 #include int..

컴퓨터공부 2008.09.25

맘에 드는 코드(* 왕복 구문)

일부러 flag를 써가면서 * 을 왕복 시킬 필요가 없이 switch문을 이용하면 좀 더 깔끔하게 처리가 되네. for (;;) { switch(i) { case 0: PC_DispStr(0, 1, "* ", DISP_FGND_YELLOW+DISP_BGND_BLACK), i=1; break; case 1: PC_DispStr(0, 1, " * ", DISP_FGND_YELLOW+DISP_BGND_BLACK), i=2; break; case 2: PC_DispStr(0, 1, " * ", DISP_FGND_YELLOW+DISP_BGND_BLACK), i=3; break; case 3: PC_DispStr(0, 1, " * ", DISP_FGND_YELLOW+DISP_BGND_BLACK), i=4; brea..

포인터 연산

int *ptr; int num[] = {2,4,6,8,10}; ptr = num; *ptr++; *ptr++; (*ptr)++; (*ptr)++; 예문이 위와 같을 때 *ptr의 값과 후치연산 후 ptr의 주소 값 이동은? 결과는 드래그 2(주소 : num[0] + 1) 4(주소 : num[0] + 1 + 1) 7(주소 : num[0] + 1 + 1) -> 후치연산 후, 주소 연산이 아니라 포인터가 가르키는 값이 증가했다. 8(주소 : num[0] + 1 + 1) -> 후치연산 후, 주소 연산이 아니라 포인터가 가르키는 값이 증가했다.

const 정리

const : const 바로 뒤에 오는 것을 바꿀 수 없다고 생각하면 쉽다. //기본 타입 int n = 10; int* const p1 = &n; // n의 값을 바꿀 수는 있지만 p1이 다른 변수를 가리킬 수 없다. const int* p2 = &n; // n의 값을 바꿀 수는 없지만 p2이 다른 변수를 가리킬 수 있다. const int* const p3 = &n; // n의 값도 바꿀 수 없고 p1이 다른 변수도 가리킬 수도 없다. //클래스 타입 Point pt; Point* const ppt1 = &pt; // pt의 멤버 변수의 값을 바꿀 수는 있지만 다른 객체를 가리킬 수 없다 const Point* ppt2 = &pt; // pt의 멤버 변수의 값을 바꿀 수는 없지만 다른 객체를 가리킬..