전에 API로 작업한 마우스좌표와 타이머의 내용을
메시지맵으로 구현한것 임.(간단 명료 ㅋㅋ)



#include<windows.h>

#define dim(x) (sizeof(x) / sizeof(x[0]))
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
HINSTANCE g_hInst;
LPCTSTR lpszClass=TEXT("First");


LRESULT MOUSEMOVE(HWND, UINT, WPARAM, LPARAM);
LRESULT LBUTTONUP(HWND, UINT, WPARAM, LPARAM);
LRESULT DESTROY(HWND, UINT, WPARAM, LPARAM);

struct decodeUINT
{
 UINT Code;
 LRESULT (*Fxn)(HWND, UINT, WPARAM, LPARAM);
};

const struct decodeUINT MainMessages[] = {
 WM_MOUSEMOVE, MOUSEMOVE,
 WM_LBUTTONUP, LBUTTONUP,
 WM_DESTROY, DESTROY
};


int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance
      ,LPSTR lpszCmdParam,int nCmdShow)
{
 HWND hWnd;
 MSG Message;
 WNDCLASS WndClass;
 g_hInst = hInstance;

 WndClass.cbClsExtra=0;
 WndClass.cbWndExtra=0;
 WndClass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
 WndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
 WndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
 WndClass.hInstance=hInstance;
 WndClass.lpfnWndProc=WndProc;
 WndClass.lpszClassName=lpszClass;
 WndClass.lpszMenuName=NULL;
 WndClass.style=CS_HREDRAW | CS_VREDRAW;
 RegisterClass(&WndClass);

 hWnd=CreateWindow(lpszClass,lpszClass,WS_OVERLAPPEDWINDOW,
  CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
  NULL,(HMENU)NULL,hInstance,NULL);
 ShowWindow(hWnd,nCmdShow);

 while(GetMessage(&Message,NULL,0,0)){
  TranslateMessage(&Message);
  DispatchMessage(&Message);
 }
 return (int)Message.wParam;
}



LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)

{
 
 int i;

 for(i = 0; i < dim(MainMessages); i++)
 {
  if(iMessage == MainMessages[i].Code)
  {
   return (*MainMessages[i].Fxn)(hWnd, iMessage, wParam, lParam);
  }
 }

 return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}


LRESULT MOUSEMOVE(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
 TCHAR str[128];
 SYSTEMTIME st;

 GetLocalTime(&st);
 wsprintf(str,TEXT("X = %d. Y = %d. %d시 %d분 %d초"),LOWORD(lParam),HIWORD(lParam),
  st.wHour, st.wMinute,st.wSecond);
 SetWindowText(hWnd,str);
 return 0;
}

LRESULT LBUTTONUP(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
 HDC hdc;
 static int x;
 static int y;

 hdc = GetDC(hWnd);
 MoveToEx(hdc,x,y,NULL);
 x = LOWORD(lParam);
 y = HIWORD(lParam);
 LineTo(hdc,x,y);
 ReleaseDC(hWnd,hdc);
 return 0;

}
LRESULT DESTROY(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
 PostQuitMessage(0);
 return 0;
}

Posted by 응이
; 자료형의 크기
DB           ; "Data Byte"의 약어로 1Byte
DW           ; "Data Word"의 약어로 2Byte
DD           ; "Data Double-Word"의 약어로 4Byte


CYLS EQU 10 ; #define CYLS  10

; 패딩
RESB 10   ; "Reserve Byte"의 약어로 10바이트를 띄워놓는다 (0x00)
RESB 0x1FE - $                    ; $는 선두로부터 몇바이트 떨어져이는지



; 명령어
ORG 0x7c00   ; 실행시에 PC의 메모리내의 어디에 로딩되는지 ($를 좌우)


MOV AX,0                            ; AX = 0
MOV BYTE[678], 123   ; BYTE[]캐스팅, '데이터크기[주소]'

ADD SI, 1                            ; SI += 1
CMP AL, 0                           ; AL과 0의 비교

HLT                                             ; CPU정지명령

 
 JUMP명령
entry:                         ; 레이블 선언

JUMP entry          ; Goto명령, 레이블로 무조건 점프
JE                             ; CMP의 비교결과가 같으면 점프
JC                             ; Carry플래그가 1이면 점프(자리올림)
JNC                           ; Carry플래그가 0이면 점프

JAC                           ; 크거나 같으면 점프
JBE                           ; 작거나 같으면 점프
JB                             ; 작으면 점프
Posted by 응이

.386
.MODEL FLAT

;함수 사용  선언(ExitProcess 함수이름 이며 반환형은 DWORD)
ExitProcess PROTO NEAR32 stdcall, dxExitCode:DWORD

;헤더파일 인클루드
INCLUDE io.h

cr EQU 0dh         ;0dh => 0x0d (h 는 16진수를 나타낸다.)#define 효과
Lf EQU 0ah         ; EQU는 (=) 과 같다

.STACK 4096        ;스택영역을 4096만큼 확보(사용할 메모리 공간 확보)

.DATA          ;변수 영역 시작
number1  DWORD ?       ;4바이트로 변수 선언
number2  DWORD ?
prompt1   BYTE "Enter first number: ",0  ;문자를 바이트 단위로 할당하고 마지막에 0을 넣는다.
                                                         0은 문자열로 넣지 않고 (,0) 을 사용

prompt2  BYTE "Enter second number: ",0
string     BYTE 40 DUP (?)                ;BYTE 단위를 40개를 DUP(할당) 한다. (?) 는 초기화
                                                      하지 않는다는 말
label1    BYTE cr, Lf, "The Sum is "  ;cr Lf 는 위에서 정의 한 값인 16진수를 사용(\n\r)효과
sum       BYTE 11 DUP (?)
             BYTE cr, Lf, 0                    ;변수명 없이 메모리만 할당(sum뒤에 이어서 cr과Lf
                                                      그리고 0이 오게된다.

.CODE                                      ;코드영역의 시작
_start:                                       ;start함수 (시작 지점을 의미)
   output prompt1                        ;output 은 메크로함수로 화면에 출력을 하는 메크로다.
   input string,40                         ;input은 입력을 받는 메크로다. 40바이트 만큼
   atod string                              ;atod는 아스키 코드를 10진수로 변환 하는 메크로다.
                                                (DWORD형으로저장후 레지스터eax에 넣어준다.)
   mov  number1,eax                    ;eax의 내용을 number1에 넣어준다. mov는 복사해주는
                                                역할을 한다.
   
   output prompt2
   input string,40
   atod string                              ;위에서 연산된 값은 지워지고 새로운 값이 eax에 저장된다.
   mov  number2,eax
   
   mov  eax,number1    
   add  eax,number2                    ;뒤에값을 앞에 값과 더해 앞에 공간에 넣어준다.
                                                 (a = a+ b 와 같다.)
   dtoa sum,eax                          ;eax에 있는 숫자를아스키 코드로 바꿔준다.(sum에 아스키
                                                 로  바꾼 값을 담아준다.)
   output label1                           ;label1 BYTE cr, Lf, "The Sum is " 으로 정의 되어 있는
                                                곳에 널문자가 없어
                                                ;다음에 있는 sum부분의 널을 만날때까지 계속 출력한다.
   INVOKE ExitProcess,0              ;INVOKE는 함수를 호출하라는 명령어 함수명은
                                                ExitProcess며 인자는 0이다.
   
PUBLIC _start                             ;PUBLIC 을 사용해서 외부로 부터의 접근을 허용한다.

END                                          ;프로그램 종료를 알리는 부분


위에서 사용된 input output 과 atod , dtoa 등은 메크로로 화면에 출력 ,입력받기,아스키를 10진수로 변환, 10진수를 아스키로 변환 하는등의 역할을 한다.  어셈블리어 코드가 아니며 따로 정의되어 있는 오브젝트 파일을 링킹시켜야 사용 가능하다.

Posted by 응이

Dream come true.
응이

달력

태그목록