BLOG main image
MAGI's Blog is powered by Textcube / Designed by Qwer999 from DesignMyself.net

MAGI Story RSS

안보신권!!

분류없음 2009/07/02 22:12 by MAGI
연마하러가기
전파하러가기
안보신권 바로가기 http://www.nis111.co.kr/go_game.asp
2009/07/02 22:12 2009/07/02 22:12

TRACKBACK URL :: http://magi.gnukorea.com/trackback/16

Encoding encode_949 = Encoding.GetEncoding(949);
byte[] byteText = encode_949.GetBytes(strText);
m_swWriter.Write(encode_949.GetString(byteText));
m_swWriter.Flush();
또는
byte[] raw = new byte[255];
byte[] dBytes = Encoding.Convert(Encoding.UTF8, Encoding.GetEncoding(949), raw);

2009/06/23 13:49 2009/06/23 13:49

TRACKBACK URL :: http://magi.gnukorea.com/trackback/15

Unicode를 사용하는데 관련된 노가다성 잡기 등을 적는 페이지.

유니코드 텍스트 파일은

파일의 처음 2바이트가 0xfffe 로 시작한다.
항상 그렇다고는 못하겠지만 메모장이나 대부분의 소프트웨어에서 이것을 지원하니 그냥 사용하면 될 듯도.

찾아보니 little endian UTF-16이라는 뜻이다.

유니코드에서 한글에 받침 있는지 확인하기

구글 캐시를 뒤져서 찾은 내용.

유니코드 2.0에서는 한글은 초성이 19개, 중성이 21개, 종성이 28개(없음도 포함)가 있습니다.
초성 19개를 0...18까지 번호를 붙이고 중성도 0...20, 종성도 역시 0...27까지 번호를
붙인다면, 원하는 코드는 0xAC00 + x*21*28 + y*28 + z (x=초성번호,
y=중성번호, z=종성번호)로 만들 수 있습니다.
종성에서 0번째에 해당하는 것은 '없음'이므로 유니코드값에서 0xAC00을 뺀 후에 28로 나누어
떨어지는지 확인하면 됩니다.

CRichEditCtrl::GetSel 의 가슴 아픈 버그

Unicode 환경에서 CString을 리턴하는 CRichEditCtrl::GetSel 함수를 사용하면 피본다.

소스를 보자면...

CString CRichEditCtrl::GetSelText() const
{
    ASSERT(::IsWindow(m_hWnd));
    CHARRANGE cr;
    cr.cpMin = cr.cpMax = 0;
    ::SendMessage(m_hWnd, EM_EXGETSEL, 0, (LPARAM)&cr);
    LPSTR lpsz = (char*)_alloca((cr.cpMax - cr.cpMin + 1)*2);
    lpsz[0] = NULL;
    ::SendMessage(m_hWnd, EM_GETSELTEXT, 0, (LPARAM)lpsz);
    return lpsz;
}

_alloca로 스택에 임시 메모리를 잡고 그 메모리를 리턴하면서 CString에 넣게 되어있는데,
문제는 잡은 메모리의 타입이 LPSTR이라는 것이다.
_UNICODE가 정의된 상태에서 이 부분은 CString::CString(LPCSTR lpsz) 생성자를 사용하게 되고,
Multibyte를 Unicode로 변환한답시고 함수를 부르는데,
lpsz의 내용은 하자없는 유니코드이니 당근 '\0'이 들어있을 것이고, 그 '\0'을 만나는 부분까지만 변환하게 되는 것이다.

즉, 첫번째 알파벳까지만 변환. 한글의 경우는 어찌 될지 보장할 수조차 없음. -_-;

sprinf, wsprintf 등등의 나름대로 유용한 기능

%s대신 %S를 쓰면 반대되는 문자열을 사용할 수 있다.

wsprintf(L"%s, %S", L"unicode", "ansi");
sprintf("%s, %S", "ansi", L"unicode");
등의 사용이 가능하다는 얘기. 아마 내부에서 변환하겠지.

USES_CONVERSION

다들 아는 매크로지만.
USES_CONVERSION 이란 매크로를 사용하면 급할 경우 유니코드와 안시 사이의 변환을 간단하게 할 수 있습니다.

사용법은 간단하지요.

// use it to call OLE here
USES_CONVERSION;
pI->SomeFunctionThatNeedsUnicode(T2OLE(lpszA));

정의된 매크로는 다음과 같습니다.

매크로 인자 결과
A2CW (LPCSTR) (LPCWSTR)
A2W (LPCSTR) (LPWSTR)
W2CA (LPCWSTR) (LPCSTR)
W2A (LPCWSTR) (LPSTR)
T2COLE (LPCTSTR) (LPCOLESTR)
T2OLE (LPCTSTR) (LPOLESTR)
OLE2CT (LPCOLESTR) (LPCTSTR)
OLE2T (LPCOLESTR) (LPCSTR)

오히려 중요한 것은 주의점이지요.

단 한가지만 인식하고 있으면 됩니다.
이 놈의 매크로는 메모리를 스택에 잡습니다!!!
위의 CRichEdit::GetSel에서와 마찬가지로 alloca 함수를 사용해서 스택에 잠깐 메모리를 할당하는 것이죠.

그로 인해 나타나는 실질적인 주의사항은

  • 과도한 순환문 속에서는 사용하면 안됩니다. - 매크로가 불릴 때마다 스택의 메모리를 잡아먹습니다. 그 메모리는 함수가 끝날 때까지 해제되지 않습니다.
  • 매크로의 결과를 리턴하면 안됩니다. - 결과로 나오는 포인터는 함수가 끝날 때까지만 유효합니다.

스택에 메모리를 잡기 때문에 속도면에서는 빠르겠지요. 참고로 코드 페이지는 기본적으로는 GetACP 함수의 결과를 사용합니다. #define을 잘 해주면 특정 코드페이지에 대해서 동작하게 할 수도 있을 것 같더군요. 

2009/05/05 17:55 2009/05/05 17:55

TRACKBACK URL :: http://magi.gnukorea.com/trackback/14

여기 오야붕 나와!

Life 2009/04/21 12:28 by MAGI
피자헛을 갔다
사용자 삽입 이미지

요쿠르트국자는 오른손잡이용이다

사용자 삽입 이미지

나는 왼손잡이다
사용자 삽입 이미지

나는 왼손잡이다
사용자 삽입 이미지

나는 왼손잡이라 오른손국자를 크로스해서 푼다

여기 오야붕나와 -_-^
2009/04/21 12:28 2009/04/21 12:28

TRACKBACK URL :: http://magi.gnukorea.com/trackback/13

그분의 한마디

Life 2009/01/28 18:56 by MAGI
권X연 님의 쪽지 :
       사진 제출해주세요 사진명을 자기가 한 음식으로 고쳐주세요
최X원 ( [왼손잡이] 오늘도 무사히... ) 님의 말 :
       자기가 한 음식.jpg??
최X원 ( [왼손잡이] 오늘도 무사히... ) 님의 말 :
       아니면 음식이름.jpg?
최X원 ( [왼손잡이] 오늘도 무사히... ) 님의 말 :
       /뻐끔/ 느림보!
권X연 ( 노나논다 ) 님의 말 :
       사진에다가 이름 해가꼬 주
최X원 ( [왼손잡이] 오늘도 무사히... ) 님의 말 :
       내이름?
최X원 ( [왼손잡이] 오늘도 무사히... ) 님의 말 :
       (--  ) 로열티 지불해야되는데..
권X연 ( 노나논다 ) 님의 말 :
       한대 맞고 줄래
한대 맞고 줄래...한대 맞고 줄래...한대 맞고 줄래...한대 맞고 줄래...한대 맞고 줄래...한대 맞고 줄래...한대 맞고 줄래...한대 맞고 줄래...한대 맞고 줄래...한대 맞고 줄래...한대 맞고 줄래...한대 맞고 줄래...한대 맞고 줄래...한대 맞고 줄래...한대 맞고 줄래...한대 맞고 줄래...한대 맞고 줄래...한대 맞고 줄래...한대 맞고 줄래...한대 맞고 줄래...한대 맞고 줄래...한대 맞고 줄래...한대 맞고 줄래...한대 맞고 줄래...한대 맞고 줄래...한대 맞고 줄래...한대 맞고 줄래...한대 맞고 줄래...한대 맞고 줄래...한대 맞고 줄래...한대 맞고 줄래...한대 맞고 줄래...한대 맞고 줄래...한대 맞고 줄래...한대 맞고 줄래...한대 맞고 줄래...한대 맞고 줄래...한대 맞고 줄래...한대 맞고 줄래...한대 맞고 줄래...한대 맞고 줄래...한대 맞고 줄래...한대 맞고 줄래...한대 맞고 줄래...한대 맞고 줄래...한대 맞고 줄래...한대 맞고 줄래...한대 맞고 줄래...한대 맞고 줄래...한대 맞고 줄래...한대 맞고 줄래...한대 맞고 줄래...


(__   )그냥 드릴께요
2009/01/28 18:56 2009/01/28 18:56

TRACKBACK URL :: http://magi.gnukorea.com/trackback/12

Basic

Programming/Assembly 2009/01/01 20:06 by MAGI
1.어셈블리어
Push  : sp 레지스터를 조작하는 명령어중의 하나이다.
       스택에 데이터를 저장하는데 쓰인다.
ex:) Push eax : 스택에 Eax의 값을 스택에 저장한다.
ex:) Push 20 :즉석값인 20을 스택에 저장한다.
ex:) Push 401F47 : 메모리 오프셋 401F47의 값을 스택에 저장한다.

Pop  : 이또한 sp 레지스터를 조작하는 명령어중 하나이다.
스택에서 데이터를 꺼내는데 쓰인다.
ex:) Pop eax :스택에 가장 상위에 있는 값을 꺼내애서 eax에 저장한다.
주의점 : Push 의 역순으로 값은 스택에서 Pop 된다.

Mov  : 메모리나 레지스터의 값을 옮길 때[로 만들 때]쓰인다.
ex:) Mov eax,ebx    :ebx 레지스터의 값을 eax로 옮긴다[로 만든다].
ex:) Mov eax,20     :즉석값인 20을 eax레지스터 에 옮긴다[로 만든다].
ex:) Mov eax,dword ptr[401F47]   :메모리 오프셋 401F47 의 값을 eax에 옮긴다[로 만든다]

Lea  : 오퍼렌드1의 값을 오퍼렌드2의 값으로 만들어준다.
ex:) Lea eax,ebx    : eax레지스터의 값을 ebx의 값으로 만든다.

Inc  : 레지스터의 값을 1증가 시킨다.
ex:) Inc eax  : Eax 레지스터의 값을 1증가 시킨다.
Dec  : 레지스터의 값을 1 감소 시킨다.
ex:) Dec eax : Eax 레지스터의 값을 1 감소 시킨다.

Add  : 레지스터나 메모리의 값을 덧셈할떄 쓰임.
ex:) Add eax,ebx   :Eax 레지스터의 값에 ebx 값을 더한다.
ex:) Add eax,50    :Eax 레지스터에 즉석값인 50을 더한다.
ex:) Add eax,dword ptr[401F47]  : Eax 레지스터에 메모리 오프셋 401F47의 값을 더한다.
Sub  : 레지스터나 메모리의 값을 뻇셈할떄 쓰임.
ex:) Sub eax,ebx   : Eax 레지스터에서 ebx 레지스터의 값을 뺸다.
ex:) Sub eax,50
Eax  : 레지스터에서 즉석값 50을 뺸다.
ex:) Sub eax,dword ptr[401F47]    :Eax 레지스터에서 메모리 오프셋 401F47의 값을 뺸다.
Nop  : 아무동작도 하지 않는다. : 90
Call : 프로시저를 호출할떄 쓰인다.
ex:) Call dword ptr[401F47]    : 메모리 오프셋 401F47을 콜한다.
Ret : 콜한 지점으로 돌아간다.
Cmp : 레지스터와 레지스터혹은 레지스터 값을 비교하기위하여 쓰인다.
ex:) Cmp eax,ebx    :Eax 레지스터와 Ebx 레지스터의 값을 비교한다.
ex:) Cmp eax,50     :Eax 레지스터와 즉석값 50을 비교한다.
ex:) Cmp eax,dword ptr[401F47]
:Eax 레지스터와 메모리 오프셋 401F47의 값을 비교한다.
Jmp : 특정한 메모리 오프셋으로 이동할떄 쓰인다.
ex:) Jmp dword ptr[401F47]   :메모리 오프셋 401F47 로 점프한다.
조건부 점프: Cmp나 Test 같은 명령어의 결과에 따라점프한다.
  Je  : Cmp나 Test 의 결과가 같다면 점프
  Jne : Cmp나 Text 의 결과가 같지 않다면 점프
  Jz  : 왼쪽 인자의 값이 0 이라면 점프
Jnz  : 왼쪽 인자의 값이 0 이 아니라면 점프
Jl   : 왼쪽 인자의 값이 오른쪽 인자의 값보다 작으면 점프(부호있는)
Jnl  : 왼쪽 인자의 값이 오른쪽 인자의 값보다 작지 않으면(크거나 같으면) 점프 (부호있는)
Jb   : 왼쪽 인자의 값이 오른쪽 인자의 값보다 작으면 점프(부호없는)
Jnb  : 왼쪽 인자의 값이 오른쪽 인자의 값보다 작지 않으면(크거나 같으면) 점프 (부호없는)
Jg   : 왼쪽 인자의 값이 오른쪽 인자의 값보다 크면 점프
Jng  : 왼쪽 인자의 값이 오른쪽 인자의 값보다 크지 않으면 (작거나 같으면) 점프
Jle   : 왼쪽 인자의 값이 오른쪽 인자의 값보다 작거나 같으면점프 (부호있는)
Jge  : 왼쪽 인자의 값이 오른쪽 인자의 값보다 크거나 같으면 점프
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
약 이정도의 명령어들이 가장 많이 나오는 것들임으로
최소한 위에 나온것들은 외워 두도록 하자.
3. 논리연산
이글에서는 5가지 논리연산에 대해서 쓸것이다.
논리연산자는 두 오퍼렌드의 값의 비트들을 대응시켜 명령에 따른 적절한 값을 구하여 첫번쨰 오퍼렌드의 값을 바꾸어 주는것이다.
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
AND 연산
대응되는 비트가 둘다 1이면 결과는 1이고 그외의 결과들은 모두 0 이 된다.
ex:) MOV EAX,8
AND EAX,10 :위를 계산하기 위해 우선 두 오퍼렌드의 값을 2진수로 바꾸어 주면 8은 1000 이 되고 10은 1010 이 되고 AND 연산은 둘다 1이여야 1이 됨으로 결과는 1000 이 됩니다.

OR 연산
대응되는 비트중 하나가 1 또는 둘다 1이면 결과는 1이고 그외는 모두 0이 된다.
ex:) MOV EAX,8
OR EAX,10
:위를 계산하기 위해 두 오퍼렌드의 값을 2진수로 바꾸어 주면 8은 1000이 되고 10은 1010이 되고 OR 연산은 한쪽 또는 양쪽둘다 1이면 1이고그외는 모두 0 임으로 결과는 1010이 된다.
XOR 연산
대응되는 비트 중에서 한비트가 1이고 다른 비트가 0이면 1이 되고 두개의 비트가 1이면 0 이 되고 두개다 0 이어도 0이 된다.
ex:) MOV EAX,8
XOR EAX,10
:위를 계산하기 위해 두 오퍼렌드의 값을 2진수로 바꾸어 주면 8은 1000이 되고 10은 1010이 되고 XOR 연산은 한쪽만 1이어야 1임으로 결과는 10이 된다.

NOT 연산
NOT 연산은 오퍼렌드의 값을 반대로 하여 준다.
ex:) MOV EAX,10
NOT EAX
:위를 계산하기 위해 오퍼렌드의 값을 2진수로 바꾸어 주면 10은 1010이 되고 NOT 연산은 1 과 0을 반대로 하여 줌으로 결과는 0101 이 된다.
*Test 연산은 오퍼렌드에 영향을 주지 않으며 플래그만 세트 시키어 준다.





2.레지스터
범용 레지스터
(1) Eax 레지스터
누산기인 Eax 레지스터는 입출력과 거의 모든 산술연산에 사용된다. 곱셋과 나눗셈, 변환 명령어등은 반드시 Eax 레지스터를 필요하게 된다.

Eax 레지스터는 32bit의 레지스터이고 16bit 의 레지스터로 ax가 있다.
(ax는 왼쪽의 ah와 오른쪽의 al로 이루어져 있다)
 (2) Ebx 레지스터
Ebx는 주소지정을 확대하기 위한 인덱스로서 사용될수 있는 유일한 범용 레지스터 이며, 다른 일반적인 계산 용도로도 쓰인다.
Ebx는 32bit 레지스터이고 16bit로 eb가 있다.
(eb는 왼쪽의 bh와 오른쪽의 bl로 이루어져 있다)
(3) Ecx 레지스터
Ecx는 루프의 반복 횟수나 좌우방향의 시프트 비트 수를 기억한다. 그외의 계산에도 사용된다.
Ecx는 32bit 레지스터이고 16bit로 cx가 있다.
(cx는 왼쪽의 ch와 오른쪽의 cl로 이루어져 있다.)
(4) Edx 레지스터
Edx는 몇몇 입출력 동작에서 사용 된다.
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
플래그 레지스터
(1) OF [Over Flow]
산술연산후 상위 비트의 오버플로를 나타냄
(2) DF [Direction]
스트링 데이터를 이동하거나 비교할떄 왼쪽 또는 오른쪽으로의 방향을 결정한다.
(4) SF [Sign]
산술결과의 부호를 나타낸다.[0=양수,1=음수]
(5) ZF [zero]
산술연산 또는 비교동작의 결과를 나타낸다.
[0=결과가 0이 아님,1=결과가 0임]

(6) CF [Carry]
산술연산후 상위 비트로부터의 캐리 그리고 시프트 또는 회전동작의 결과 마지막 비트
내용을 저장한다.

(7) TF [trap]
프로세서가 단일 스텝 모드(single-step mode)를 동작할수 있도록 해준다.











5. Assembly 명령어


MOV <Destination>, <Source> - Move. 값을 대입하려고 할때 사용한다. 사용 방법에는 <Destination>에는 레지스터, 메모리등이 올 수 있으며 <Source>에는 <Destination>와 같은 것 이외에 직접적인 값 등이 올 수 있다.
Example:
MOV EAX, 14h
MOV EAX, DWORD PTR SS:[EBP-14]
MOV DWORD PTR SS:[EBP-14], EDX


MOVS, MOVSB, MOVSW, MOVSD(Move String Byte or Word or DWord) - ESI가 가르키는 곳의 값들을 Byte(1byte), Word(2byte), DWord(4byte)크기만음 EDI가 가르키는 곳으로 이동시킨다.

MOVSX(Move with Sign-Extended) - Byte나 Word크기의 Operand를 Word나 DWord사이즈로 늘려준다. 부호는 유지된다.


MOVZX(Move with Zero-Extended) - Byte나 Word크기의 Operand를 Word나 DWord사이즈로 늘려준다. 연산 후 채워지지 않은 공간에는 0으로 매꾼다.


INT <Value> - Interrupt. 해당 Value에 따른 Interrupt를 발생시킨다. <Value>에 해당하는 것들이 너무 많으므로 다음에 더욱 자세하게 다루기로 하자.
Example:
INT 21h


ADD <Destination>, <Source> - Addition. 간단하다. <Destination>+<Source>한 값을 <Destination>에 저장한다. <Destination>에는 레지스터, 메모리등이 올 수 있으며 <Source>에는 <Destination>와 같은 것 이외에 직접적인 값 등이 올 수 있다.
Example:
MOV EAX, 5h
MOV EBX, 12h
ADD EAX, 5h  ; EAX에는 5h + 5h = Ah(10진수로 10)가 저장된다.
ADD EAX, EBX ; EAX에는 Ah + 12h = 1Ch(10진수로 28)가 저장된다.


SUB <Destination>, <Source> - Subtact. ADD명령어와 사용법은 동일하다. 단지 기능은 빼주는 역할이라는거!
Example:
MOV EAX, 4h
SUB EAX, 3h ; EAX에는 4h - 3h = 1h가 저장된다.


INC <Target> - Increments. 타겟의 값에서 1을 증가시킨다. <Target>에는 레지스터, 메모리등이 올 수 있으며, 직접적인 값은 불가능하다.
Example:
MOV EAX, 4h
INC EAX     ; EAX에는 4h에서 1증가된 값인 5h가 저장된다.


DEC <Target> - Decrements. 타겟의 값에서 1을 감소시킨다. <Target>에는 레지스터, 메모리등이 올 수 있으며, 직접적인 값은 불가능하다.
Example:
MOV EAX, 4h
DEC EAX     ; EAX에는 4h에서 1감수한 값인 3h가 저장된다.


JMP <Location> - Jump. 어떠한 장소로 점프한다. 쉽게 생각해서 GOTO문을 생각하면 될것이다. <Location>에는 점프할 곳의 코드주소를 담고있는 레지스터나 메모리등이 올 수 있다.
Example:
JMP 0041D983
JMP DWORD PTR SS:[EBP-14]


** Conditional JUMP **


JMP명령어와 같다. 단지 조건에 따라서 Jump할지 안할지가 결정되므로 Conditional Jump라고 하겠다. Conditional JUMP는 CMP명령어와 같이 사용된다.


CMP <Target1>, <Target2> - 두 타겟을 비교해서 Flag Register를 변경시킨다. <Target1>이 <Target2>보다 작으면 CF가 Set되고, 같으면 ZF가 Set되고 이런것 들이 있긴하지만, 다음에 왠만하면 Conditional Jump가 있기때문에 Jump문 의미로 이해하도록 하고 CMP로 인한 Flag 변화는 그냥 넘어가도록 하겠다.
Example:
CMP EAX, EBX


Unsigned
JA(JUMP if ABOVE)                                     CF=0 and ZF=0
JAE(JUMP if ABOVE or EQUAL)                    CF=0
JB(JUMP if BELOW)                                     CF=1
JBE(JUMP if BELOW or EQUAL)                    CF=1 and ZF=1
JNA(JUMP if NOT ABOVE)                            CF=1 or ZF=1
JNAE(JUMP if NOT ABOVE or EQUAL)           CF=1
JNB(JUMP if NOT BELOW)                            CF=0
JNBE(JUMP if NOW BELOW or EQUAL)          CF=0 and ZF=0
JE(JUMP if EQUAL)                                      ZF=1
JNE(JUMP if NOT EQUAL)                             ZF=0

Signed
JG(JUMP if GREATER)                                 ZF=0 and SF=OF
JGE(JUMP if GREATER or EQUAL)                SF=OF
JL(JUMP if LOWER)                                     SF!=OF
JLE(JUMP if LOWER or EQUAL)                    ZF=1 and SF!=OF
JNG(JUMP if NOT GREATER)                        ZF=1 or SF!=OF
JNGE(JUMP if NOT GREATER or EQUAL)       SF!=OF
JNL(JUMP if NOT LOWER)                            SF=OF
JNLE(JUMP if NOT LOWER or EQUAL)           ZF=0 and SF=OF
JE(JUMP if EQUAL)                                     ZF=1
JNE(JUMP if NOT EQUAL)                            ZF=0

Flag
JC(JUMP if CARRY flag set)                        CF=1
JNC(JUMP if NOT CARRY flag set)               CF=0
JO(JUMP if OVERFLOW flag set)                  OF=1
JNO(JUMP if NOT OVERFLOW flag set)         OF=0
JP(JUMP if PARITY flag set)                        PF=1
JNP(JUMP if NOT PARITY flag set)               PF=0
JPE(JUMP if PARITY is EVEN)                     PF=1
JPO(JUMP if PARITY is ODD)                      PF=0
JS(JUMP if SIGNAL flag set)                       SF=1
JNS(JUMP if NOT SIGNAL flag set)              SF=0
JCXZ(JUMP if CX is ZERO)                       CX=0

AND <Destination>, <Source> - Logical AND. 논리회로에 있어서의 AND연산을 수행한다. 그리고 AND연산을 시행할때, OF, CF는 초기화되고, ZF는 Set될 수 있다.
Example:
AND EAX, EBX

CALL <Location> - Call. 말그대로 함수를 부를때 사용한다. Jump와 같다고 느껴질지도 모르지만 Call문을 시행할 경우 스택에 Call문이 시행된것을 Push를 하며 Return이 가능하다.
Example:
CALL 0041D983
CALL DWORD PTR [EBX]

DIV <Target> - Division. EAX를 <Target>으로 나누는 연산이다. 결과로 몫은EAX에 나머지는 ECX에 들어간다.
Example:
MOV EAX, 64h
MOV ECX, 9h
DIV ECX       ; 64h(100) / 9h(9) = 몫 : 0Bh(11) , 나머지 1h이므로
                EAX = 0Bh, ECX = 1h가 저장된다.


IDIV <Target> - Integer Division. DIV와 똑같다. 하지만 다른점은 부호있는 정수를 다룬다는 점이다.


MUL <Target> - Multiplication. EAX와 <Target>을 곱하여 EAX에 저장한다.
Example:
MOV EAX, 2h
MUL 4h       ; EAX에는 2h * 4h = 8h가 저장된다.


IMUL <Value> - Integer Multiplication. EAX와 <Value>를 곱하여 EAX에 저장한다.
IMUL <Destination>, <Value> - <Destination>과 <Value>를 곱하여 <Destination>에 저장한다.
IMUL <Destination>, <Value>, <Value> - 2개의 <Value>를 곱한 후에 <Destination>에 저장한다.


LEA <Destination>, <Source> - Load Effective Address. <Source>의 실제 주소를 <Destination>에 저장한다. 하지만 이 용도보다는 빠른 계산을 위해 주로 사용된다. 예를들어 LEA EAX, DWORD PTR [2*EAX+ECX]를 하면, EAX에 2*EAX+ECX계산값이 들어가게 된다.


NOP - No Operation. 아무것도 하지 않는다.


OR <Destination>, <Source> - Logical OR. 논리회로에 있어서의 OR연산을 수행한다. 그리고 OR연산을 시행할때, OF, CF는 초기화되고, ZF는 Set될 수 있다.
Example:
OR EAX, EBX


POP <Destination> - POP. 스택에서 ESP가 가르키는 곳에서 주소값을 불러내어 <Destination>에 저장한다. 그리고 ESP는 다음값을 가르키게 된다.
Example:
POP EAX


PUSH <Source> - 스택에 <Source>를 집어넣는다. ESP는 최근에 PUSH한 값을 가르키게 된다.
Example:
PUSH EAX


RET - Return. 스택에서 주소를 POP해온 후 그 주소로 돌아간다. PUSH와 RET을 조합해서 JMP처럼 사용 할 수 있다.


TEST <Target1>, <Target2> - 이 연산은 대부분이 <Target1>과 <Target2>가 같게 설정된다. 예를들면 TEST EAX, EAX. 이 연산은 논리회로의 AND연산을 수행하지만 결과값을 저장하지 않는다. 단지 EAX=0일경우 ZF=1이 되고 EAX!=0일경우 ZF=0이 된다. 그리고 OF, CF는 0이된다.
Example:
TEST EAX, EAX


XOR <Destination>, <Source> - Logical Exclusive OR. 논리회로에 있어서 XOR연산을 수행한다. XOR연산을 시행할때, OF, CF는 초기화되고, ZF는 Set될 수 있다. 이 연산은 XOR EAX, EAX처럼 많이 사용되는데, 이렇게 할 경우 XOR=0이 된다. 이유는 직접 해보면 알것이다.
Example:
XOR EAX, EBX
XOR EAX, EAX     ; EAX=0이 됨.


LODS, LODSB, LODSW, LODSD(Load String Byte, Word, DWord) - ESI가 가르키는 곳에서 지정한 크기(Byte, Word, DWord) 만큼 읽어와 EAX에 복사한다. ESI는 복사한만큼 이동한다.


STOS, STOSB, STOSW, STOSD(Store String Byte, Word, DWord) - EAX에 들어이있는 데이터를 지정한 크기만큼 EDI가 가르키는 주소에 복사한다. EDI는 복사된 만큼 이동한다.


CLD(Clear Direction flag), STD(Set Direction flag) - Direction Flag를 Set하거나 Clear할때 사용한다.


CMC(Complement Carry flag), CLC(Clear Carry flag), STC(Set Carry flag) - Carry flag를 순서대로 반전, Clear, Set시킨다.


SHL <Destination>, <Value> - Shift Logical Left. <Destination>에 <Value>만큼 Shift연산을 왼쪽으로 수행한다. 만약 <Destination>보다 커질경우 CF=1이 된다.


SHR <Destination>, <Value> - Shift Logical Right. SHL과 기능은 동일하며 Shift연산이 오른쪽으로 진행된다.


ROL <Destination>, <Value> - Rotate Left. SHL과 기능은 동일하다. 단지 자리수가 늘어날경우 해당 비트가 오른쪽 끝으로 이동한다.


ROR <Destination>, <Value> - Rotate Reft. SHR과 기능은 동일하다. 단지 자리수가 없어질경우 해당 비트가 왼쪽 끝으로 이동한다.



1. 나눗셈 연산의 피젯수는(32bit의 나눗셈을 가정) 항상 edx:eax 이다.
2. cdq 는 나눗셈을 위해 피젯수의 사이즈를 확장하는 것이다.


나눗셈연산(div, idiv)은 eax와 edx에 의해서만 이루어집니다
- 피젯수(나눔을 당하는 수) 는 eax, edx에만 들어갈 수 있다는 얘기에요
16 / 5 연산을 한다고 가정해 봅시다.

16과 5 둘다 32bit data라고 가정하구요

그럼 일단 eax에 16을 넣습니다. 그 다음 ebx(다른레지스터나 메모리도 상관없음)에

5를 넣습니다. 그 다음 div 연산을 하면.........될것 같지만 안됩니다..

일반적으로 제수(여기서는 5)가 32bit이면 피젯수(여기서는 16) 는 64bit가 되어야

32bit 값을 가지는 몫을 얻을 수 있습니다.

그래서 피젯수의 bit를 확장 시켜주는것이 바로 cdq 연산입니다

32bit 크기의 eax의 값을 64bit의 값인 edx:eax로 만들어줍니다.

여기서 edx는 상위자리가되고 eax는 하위 자리가 되죠

자..그럼 cdq 연산까지 끝났으면 edx:eax에 16이 들어가있고 ebx에 5가 들어있겠네요

그럼 idiv연산을 해봅시다(div는 부호가없는 나눗셈 idiv 부호가 있는 나눗셈)

그럼 몫과 나머지가 나와야 하겠죠? 그 결과는 다시 eax와 edx로 들어가는데

eax에는 몫이, edx에는 나머지 부분이 들어갑니다~



LoadLibrary GetProcAddress (로드 라이브러리 겟프락어드레스) 후에 변하지 않는 레지스터는
EBX EBP ESI EDI 이다. EAX, ECX, EDX 가 변한다

출처 : http://zerohz.tistory.com/61

2009/01/01 20:06 2009/01/01 20:06

TRACKBACK URL :: http://magi.gnukorea.com/trackback/11

  1. basic-으로 이어질 블로그링

    : blogring.org 2009/01/10 11:44 삭제하기

    basic-에 관한블로그를 요약한 것입니다.

뭐래는거냐!

Electronic Device 2008/12/29 13:21 by MAGI
뭐래는거냐!!
사용자 삽입 이미지
2008/12/29 13:21 2008/12/29 13:21

TRACKBACK URL :: http://magi.gnukorea.com/trackback/10

T타입 함수명

Programming/C & C++ 2008/12/17 21:01 by MAGI

일반 함수명 T타입 함수명 기능
strcpy _tcscpy 문자열 복사
strncpy _tcsncpy 특정 길이 문자열 복사
strcat _tcscat 문자열 추가
strstr _tcsstr 문자열 검색
strchr _tcschr 문자 검색
strrchr _tcsrchr 역순 문자 검색
strcmp _tcscmp 문자열 비교
stricmp _tcsicmp 대소문자 구분 없이 문자열 비교
mkdir _tmkdir 디렉터리 생성
fopen _tfopen 파일 열기

2008/12/17 21:01 2008/12/17 21:01

TRACKBACK URL :: http://magi.gnukorea.com/trackback/9

출처 : http://www.devpia.com/Maeul/Contents/Detail.aspx?BoardID=5069&MAEULNo=606&no=34675
         김영준 (mandara7) 님의 글

------------------------------------------------------------------------------------------------

C++ 또는 C로 개발된 dll을 C#에서 사용하기 위한 자료 모음입니다. 아래의 자료들을 참고하시기 바라며, 기본적으로, 내부 코딩내용에 따라서는 아래의 설정작업이 추가적으로 필요할 수 있습니다.


1. C# 프로젝트 속성에서 빌드 속성탭에 있는 Allow Unsafe Code 항목에 체크합니다.



2. Using 문장에 아래의 코드가 반드시 추가되어 있어야 합니다.


using System.Runtime.InteropServices;


3. 간혹, 프로그램 실행코드 내에 아래와 같은 선언이 필요할 수 있습니다.


private void Form1_Load(object sender, EventArgs e)

{

   ...

   CheckForIllegalCrossThreadCalls = false;

}


4. 기타 세부적인 호출 방법에 대해서는 아래의 목록들을 확인하기 바랍니다.


Using Unmanaged code and assembler in C#<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

http://www.codeproject.com/KB/cs/unmanage.aspx

 

Marshal an array of zero terminated strings or structs by ref

http://www.codeproject.com/KB/cs/marshalarrayofstrings.aspx

 

The CLR, and How It Works for Interoperation

http://www.codeproject.com/KB/dotnet/An_Overview_of_P_Invoke.aspx

 

Simplify Native DLL Documentation for Use by .NET / Managed Code Authors

http://www.codeproject.com/KB/dotnet/SimplifyNativeDLLDocument.aspx

 

Getting unsafe with pointers in C#

http://www.codeproject.com/KB/cs/csunsafeintro01.aspx

 

Calling Unmanaged Code from .NET and Device Detection with C#.NET

http://www.codeproject.com/KB/cs/callNdetect.aspx

 

Using managed code in an unmanaged application

http://www.codeproject.com/KB/mcpp/ijw_unmanaged.aspx

 

How to create a DLL library in C and then use it with C#

http://www.codeproject.com/KB/cs/usecdlllibincs.aspx

 

Using Unmanaged C++ Libraries (DLLs) in .NET Applications

http://www.codeproject.com/KB/mcpp/usingcppdll.aspx

 

How to Marshal a C++ Class

http://www.codeproject.com/KB/cs/marshalCPPclass.aspx

 

Execute Native Code From .NET

http://www.codeproject.com/KB/dotnet/native_net.aspx

 

Pointers UNDOCUMENTED

http://www.codeproject.com/KB/dotnet/pointers.aspx

 

Handling unmanaged memory pointers in managed memory

http://www.codeproject.com/KB/cs/unmanaged_memory_pointers.aspx

 

Mixing Managed and Unmanaged code

http://www.codeproject.com/KB/dotnet/managed_unmanaged.aspx

 

Calling Managed .NET Function from Unmanaged Windows Custom DLL

http://www.codeproject.com/KB/cs/win32_to_net.aspx

 

Creating and calling C function dll from .NET

http://www.codeproject.com/KB/dotnet/c_dll_in_vb.aspx

 

Exporting C++ Classes from an MFC Extension DLL

http://www.codeproject.com/KB/DLL/dllexport.aspx

 

Calling API functions using C#

http://www.codeproject.com/KB/cs/c__and_api.aspx

 

Using the _CDECL calling convention in C# (changing compiler service)

http://www.codeproject.com/KB/cs/cdeclcallback.aspx

 

Late binding on native DLLs with C#

http://www.codeproject.com/KB/cs/dyninvok.aspx

 

Reusing Legacy DLLs in C#

http://www.codeproject.com/KB/cs/interopBycchrism.aspx

 

Creation of a Simple DLL

http://www.codeproject.com/KB/DLL/dll.aspx

 

Dlls are Simple. Part 1

http://www.codeproject.com/KB/DLL/Dllfun.aspx

 

Regular DLL Tutor For Beginners

http://www.codeproject.com/KB/DLL/RegDLL.aspx

 

Create Simple Load time DLLs

http://www.codeproject.com/KB/DLL/rsLoadtimeDLL.aspx

 

Late-Binding DLLs in C#

http://www.codeproject.com/KB/cs/cscpplatebind.aspx

 

Using classes exported from dlls

http://www.codeproject.com/KB/DLL/export_class_from_dll.aspx

 

Win32 API: C++ to .NET

http://www.codeproject.com/KB/dotnet/Win32APICPlusPlustoDotNET.aspx

 

Using Platform Invoke

http://www.codeproject.com/KB/dotnet/PInvoke.aspx

 

Essential P/Invoke

http://www.codeproject.com/KB/cs/essentialpinvoke.aspx

 

Advanced P/Invoke on the Microsoft .NET Compact Framework

http://www.codeproject.com/KB/mobile/compframe2.aspx

 

An Introduction to P/Invoke and Marshaling on the Microsoft .NET Compact Framework

http://www.codeproject.com/KB/mobile/compframe1.aspx

 

Using P/Invoke in a managed C++ application

http://www.codeproject.com/KB/mcpp/pinvoke.aspx

 

Writing Hello World in different styles using C# and .NET

http://www.codeproject.com/KB/cs/differenthelloworlds.aspx

 

DLL Template which lets your project take off

http://www.codeproject.com/KB/DLL/DLL_Skeleton.aspx

 

Creating a control with the .NET SDK using C#

http://www.codeproject.com/KB/miscctrl/mycontrol.aspx

 

HOWTO: Combine Managed and Unmanaged Projects into a Single Visual Studio Solution

http://www.codeproject.com/KB/mobile/MakeDemo.aspx

 

Get the calling module that invoked your function

http://www.codeproject.com/KB/mcpp/getcallingmodule.aspx

 

Playing with the stack

http://www.codeproject.com/KB/tips/stackdumper.aspx

 

Using the COM Component Categories Manager in .NET

http://www.codeproject.com/KB/COM/RobinComCat.aspx

 

Making DLLs easy to build and use

http://www.codeproject.com/KB/DLL/DLL_EZ_Build_EZ_Usage.aspx

 

Sub classing a C# window in a dll created using embedded VC++

http://www.codeproject.com/KB/mobile/CompactFramework.aspx

 

Component-Based Development with Visual C#

http://www.codeproject.com/KB/books/0764549146_8.aspx

 

C# Keywords, Part I: Modifier Keywords

http://www.codeproject.com/KB/cs/modifierkeywords.aspx

2008/12/17 13:32 2008/12/17 13:32

TRACKBACK URL :: http://magi.gnukorea.com/trackback/8

고문의 대가

Life 2008/11/23 21:42 by MAGI
헬스 헬스!! 나도 운동좀 해볼까나 음흐흐흐 +_+
무려 85,000원 이나 하는 헬스장 + 목욕을 등록했다.
이동네 왜케 비싸!!
허이짜! 허이짜!  10분동안 코스1 달리기!
첫날을 그렇게 지나갔다.

문제는 둘째날...
평소 오전 6~7시 사이 헬스장을 가던 나는 한번도 트레이너를 보지 못한것이다.
이노무 트레이너는 게으름뱅이~

동생따라 오후에 헬스장을 가게된 엇그제!!
이 무지막지한 트레이너를 만나게 된 것이다.

우오.. 저 무지막지하고도 휘양찬란한 근육을보라..
너무 근육을 키워대서 별로 멋도 없을뿐더러 움직이기도 불편해보인다.
팔을 뒤로 넘겨 잡을 수 있긴할까?
유연함이라고는 눈꼽만치도 찾을수 없을것 같은 불편해 보이는 근육이었다.

일단 등록하는거랜다...
자아. 여기 동그라미 친 곳만 작성해 주세요
나는 아무런 의심없이 이름과 전화번호를 적었다.
뜬금없이 트레이너는 카메라를 꺼냈다.

사진 찍습니다~ 찰칵!
멍..하니 사진이 찍혀버렸다.. 제길슨!!

"자.. 오늘은 기구 사용법을 배우겠습니다"
"이 기구는 상체 근육을 기르는 겁니다. 가슴을 내밀고 허리를 펴고! 훗짜! 훗짜!"

오호라.. 쉬운거군 나도 할 수 있겠다.
흐이짜! 흐이짜! 헉.헉. 헥헥. 으..으..
"자 이제 뒤로하세요 이렇게요. 내릴땐 빨리!"
흐이짜! 흐이짜! 헉.헉. 헥헥. 으..으..

이거 미치겠다.. 이빨을 악물고 하게된다.
팔에 점점 힘이빠진다.
현기증이 난다.

계속해야 잊지 않는거랜다.. 이제 알아서 해보랜다.
(허이짜 반복)

그렇게 여러 기구를 죽살나게 배우고 돌아왔다..
팔이 올라가질 않는다..
밥숫가락도 못들것같다..
내일 머리는 어찌 감을 것이며 세수는 어찌해야하나.. (__  )

그리 한탄하던중 그제서야 동생이 말해준다.

그거 자유운동 체크하면 되는데요? 전 자유운동 체크했어요~
뭐? 그걸 왜 이제 얘기해!

우어..우어.. 당한느낌이다.
억울하다.
그 트레이너 다시 만나기 싫다 -_-
그걸 왜 가르쳐주지 않은거냐!
동그라미 친곳만 쓰라메~~

당했다! 제길슨...
아직도 몸이 아프다..

새벽에 갈테다..새벽에 갈테다..새벽에 갈테다..새벽에 갈테다..새벽에 갈테다..새벽에 갈테다..새벽에 갈테다..새벽에 갈테다..새벽에 갈테다..새벽에 갈테다..새벽에 갈테다..새벽에 갈테다..새벽에 갈테다..새벽에 갈테다..새벽에 갈테다..새벽에 갈테다..새벽에 갈테다..새벽에 갈테다..새벽에 갈테다..새벽에 갈테다..새벽에 갈테다..새벽에 갈테다..새벽에 갈테다..새벽에 갈테다..새벽에 갈테다..새벽에 갈테다..새벽에 갈테다..새벽에 갈테다..새벽에 갈테다..새벽에 갈테다..새벽에 갈테다..새벽에 갈테다..새벽에 갈테다..새벽에 갈테다..새벽에 갈테다..새벽에 갈테다..새벽에 갈테다..새벽에 갈테다..새벽에 갈테다..새벽에 갈테다..새벽에 갈테다..새벽에 갈테다..새벽에 갈테다..새벽에 갈테다..새벽에 갈테다..새벽에 갈테다..새벽에 갈테다..새벽에 갈테다..새벽에 갈테다..새벽에 갈테다..새벽에 갈테다..새벽에 갈테다..새벽에 갈테다..새벽에 갈테다!!!!!!!!!!!!!



2008/11/23 21:42 2008/11/23 21:42

TRACKBACK URL :: http://magi.gnukorea.com/trackback/7

1 2 
전체 (16)
Life (4)
Book (1)
Enjoy (1)
Movie (0)
Travel (0)
Programming (6)
Electronic Device (3)

공지사항

최근에 달린 댓글

최근에 받은 트랙백