메모리에 있는 값을 가져오는 방식은 Direct모드와 Indirect 모드가 있다.

LOAD, STORE 명령어 사용시  제한적인 비트 사용 범위 때문에 메모리 접근 범위가 제한된다.

이러한 문제를 해결하기 위해서 Indirect 모드를 사용한다.


Direct Addressing Mode

- 메모리에 있는 값을 그대로 레지스터로 LOAD하는 모드


Indirect Addressing Mode

- 메모리에 있는 값이 주소값이며, 그 주소값을 참조해 메모리에 있는 값을 레지스터로 LOAD하는 모드


비트 사용 범위 제한 때문에 표현 가능한 메모리 주소 범위를 벗어난 경우 InDirect 모드를 사용하게 되는데, 다음과 같다.


ex) 

int a = 10;         //0x0010 번지 할당

int b = 20;         //0x0100 번지 할당

int c = 0;           //0x0020 번지 할당


비트 사용 범위 제한 때문에 b(0x0100)을 표현 할 수 없다.


1. 사칙연산을 통해서 0x0100 이라는 값을 생성한다.


2. 0x0100을 레지스터에 저장한다. (저장된 레지스터는 r3)


3. 레지스터에 저장된 0x0100을 표현 가능한 메모리 공간에 STORE 한다. (STORE r3, 0x0030)


4. 그럼 메모리 0x0030에는 0x0100이라는 주소값이 들어가게 된다.


5. 'LOAD r2, [0x0030]' 명령어를 이용해서 0x0030이 가리키는 곳의 값을 레지스터 r2에 LOAD한다.


이런식으로 표현 가능 범위를 벗어난 메모리 공간에 접근하는 방식을 Indirect Addressing 모드라고 한다.



기본적으로 포인터 크기가 32비트, 64비트 라는 차이점이 있다.


Polymorphic 자료형


#if defined(_WIN64)

typedef __int64                 LONG_PTR;

typedef unsigned __int64    ULONG_PTR;

typedef __int64                 INT_PTR;

typedef unsigned __int64    UINT_PTR;

#else

typedef    long                LONG_PTR;

typedef    unsigned long   ULONG_PTR;

typedef    int                   INT_PTR;

typedef    unsigned int      UINT_PTR;

#endif


여기서의 PTR은 포인터 형을 의미하는 것이 아니라, 포인터 연산을 위해 정의 되었다는 의미이다. 



오류의 확인

GetLastError 함수

- 오류가 발생할 때 마다 전역 공간에 오류 코드가 저장된다.

- 전역 공간에 저장된 오류 코드를 GetLastError 함수를 이용해서 얻어온다.

- 오류의 발생여부를 확인하는 함수가 아니라, 오류가 발생했을 때 어떤 오류가 발생했는지 알기 위한 함수이다.

- 시스템 함수를 호출하고 나서 다른 시스템 함수를 호출 하기 전에 GetLastError 함수를 호출 해야 한다.

(전역공간을 공유 하기 때문에 그런듯?)

WBCS의 이점에도 불구하고 MBCS를 포기하지 못하는 이유는 다음과 같다.

- 이전에 만들어진 프로그램과의 호환성

- WBCS(유니코드)를 지원하지 못하는 사용자의 시스템


그래서 MBCS와 WBCS를 동시 지원하도록 개발을 해야한다.

(두가지로 나누어서 개발시 유지보수, 배포에 불편한점이 많다.)


windows 헤더 파일


#include <windows.h>


typedef    char            CHAR;

typedef    wchar_t        WCHAR;


#define    CONST        const


typedef    CHAR*                LPSTR;

typedef    CONST CHAR*      LPCSTR;


typedef    WCHAR *                LPWSTR;

typedef    CONST WCHAR *      LPCWSTR;



MBCS와 WBCS 동시 지원 매크로


#ifdef UNICODE

typedef    WCHAR        TCHAR;

typedef    LPWSTR        LPTSTR;

typedef    LPCWSTR      LPCTSTR;

#else

typedef    CHAR           TCHAR;

typedef    LPSTR           LPTSTR;

typedef    LPCSTR         LPCTSTR;

#endif


#ifdef _UNICODE

#define    __T(x)    L##x        //__T("ABC") => L"ABC" 이렇게 변경된다. (x에 L을 붙여라)

#else

#define    __T(x)    x

#endif


#define    _T(x)         __T(x)

#define    _TEXT(x)    __T(x)


MBCS와 WBCS 동시 지원 함수


#ifdef _UNICODE

#define            _tmain    wmain

#define            _tcslen    wcslen

#define            _tprintf    wprintf

#define            _tscanf    wscanf

#else

#define            _tmain    main

#define            _tcslen    strlen

#define            _tprintf    printf

#define            _tscanf    scanf

#endif


동시 지원 프로그래밍 예시


LPTSTR str1 = _T("MBCS or WBCS1");

TCHAR str2[] = _T("MBCS or WBCS2");

TCHAR str3[100];

TCHAR str4[50];


LPCTSTR pStr = str1;


_tprintf(_T("string size " %d \n"), sizeof(str2));

_tprintf(_T("string length : %d \n"), _tcslen(pStr));


_fputts(_T(intput String 1 : "), stdout);

_tscanf(_T("%s"), str3);

+ Recent posts