본문 바로가기
코스웨어/15년 스마트컨트롤러

20151127 임현수 업무일지 ARM #2 함수호출규약

by 알 수 없는 사용자 2015. 11. 29.
728x90
반응형

LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam )
{
     HDC hdc;
     PAINTSTRUCT ps;
     static HWND c1, c2, c3, c4;
     static BOOL ELLIPSE = FALSE;

     switch (iMessage)
     {
           case WM_CREATE:
              c1 = CreateWindow(TEXT ("button" ), TEXT("Draw Ellipse?" ), WS_CHILD | WS_VISIBLE | BS_CHECKBOX, 20, 20, 160, 25, hWnd , (HMENU )0, g_hInst, NULL);
              c2 = CreateWindow(TEXT ("button" ), TEXT("Good bye Message?" ), WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX, 20, 50, 160, 25, hWnd , (HMENU )1, g_hInst, NULL);
              c3 = CreateWindow(TEXT ("button" ), TEXT("3State?" ), WS_CHILD | WS_VISIBLE | BS_3STATE , 20, 80, 160, 25, hWnd, (HMENU )2, g_hInst, NULL);
              c4 = CreateWindow(TEXT ("button" ), TEXT("Auto 3State?" ), WS_CHILD | WS_VISIBLE | BS_AUTO3STATE, 20, 110, 160, 25, hWnd , (HMENU )3, g_hInst, NULL);
               return 0;

           case WM_DESTROY:
               if ( SendMessage(c2, BM_GETCHECK , 0, 0) == BST_CHECKED)
              {
                    MessageBox(hWnd , TEXT ("Good bye" ), TEXT("Check" ), MB_OK );
              }
              PostQuitMessage(0);
               return 0;

           case WM_PAINT:
              hdc = BeginPaint( hWnd, &ps);
               if (ELLIPSE == TRUE)
              {
                   Ellipse(hdc, 200, 100, 400, 200);
              }
               else
              {
                   Rectangle(hdc, 200, 100, 400, 200);
              }
              EndPaint( hWnd, &ps);
               return 0;

           case WM_COMMAND:
               switch ( LOWORD( wParam))
              {
                    case 0:
                         if ( SendMessage(c1, BM_GETCHECK , 0, 0) == BST_UNCHECKED)
                        {
                              SendMessage(c1, BM_SETCHECK , BST_CHECKED, 0);
                             ELLIPSE = TRUE;
                        }
                         else
                        {
                              SendMessage(c1, BM_SETCHECK , BST_UNCHECKED, 0);
                             ELLIPSE = FALSE;
                        }
                        InvalidateRect( hWnd, NULL, TRUE);
                         break;

                    case 2:
                         if ( SendMessage(c3, BM_GETCHECK , 0, 0) == BST_UNCHECKED)
                        {
                              SendMessage(c3, BM_SETCHECK , BST_CHECKED, 0);
                        }
                         else if ( SendMessage(c3, BM_GETCHECK, 0, 0) == BST_INDETERMINATE )
                        {
                              SendMessage(c3, BM_SETCHECK , BST_UNCHECKED, 0);
                        }
                         else
                        {
                              SendMessage(c3, BM_SETCHECK , BST_INDETERMINATE, 0);
                        }
                         break;

                    default:
                         break;
              }
               return 0;
     }
     return(DefWindowProc( hWnd, iMessage, wParam, lParam));
}





LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam )
{
     HDC hdc;
     PAINTSTRUCT ps;
     HBRUSH MyBrush, OldBrush;

     switch (iMessage)
     {
     case WM_CREATE:
           CreateWindow(TEXT ("button" ), TEXT ("Graph" ), WS_CHILD | WS_VISIBLE | BS_GROUPBOX
              , 5, 5, 120, 110, hWnd, ( HMENU)0, g_hInst, NULL);
           CreateWindow(TEXT ("button" ), TEXT ("Color" ), WS_CHILD | WS_VISIBLE | BS_GROUPBOX
              , 145, 5, 120, 110, hWnd, ( HMENU)1, g_hInst, NULL);
          r1 = CreateWindow(TEXT ("button" ), TEXT("Rectangle" ), WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON | WS_GROUP
              , 10, 20, 100, 30, hWnd, ( HMENU) ID_R1, g_hInst, NULL);
          r2 = CreateWindow(TEXT ("button" ), TEXT("Ellipse" ), WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON
              , 10, 50, 100, 30, hWnd, ( HMENU) ID_R2, g_hInst, NULL);
          r3 = CreateWindow(TEXT ("button" ), TEXT ("Line" ), WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON 
              , 10, 80, 100, 30, hWnd, ( HMENU) ID_R3, g_hInst, NULL);
          r4 = CreateWindow(TEXT ("button" ), TEXT ("Black" ), WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON | WS_GROUP
              , 150, 20, 100, 30, hWnd, ( HMENU) ID_R4, g_hInst, NULL);
          r5 = CreateWindow(TEXT ("button" ), TEXT ("Red" ), WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON
              , 150, 50, 100, 30, hWnd, ( HMENU) ID_R5, g_hInst, NULL);
          r6 = CreateWindow(TEXT ("button" ), TEXT ("Blue" ), WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON 
              , 150, 80, 100, 30, hWnd, ( HMENU) ID_R6, g_hInst, NULL);
          CheckRadioButton( hWnd, ID_R1, ID_R3, ID_R1);
          CheckRadioButton( hWnd, ID_R4, ID_R6, ID_R4);
           return 0;

     case WM_DESTROY:
          PostQuitMessage(0);
           return 0;

     case WM_PAINT:
          hdc = BeginPaint( hWnd, &ps);
           switch (COLOR)
          {
           case 0:
              MyBrush = CreateSolidBrush( RGB(0, 0, 0));
               break;
           case 1:
              MyBrush = CreateSolidBrush( RGB(255, 0, 0));
               break;
           case 2:
              MyBrush = CreateSolidBrush( RGB(0, 0, 255));
               break;
           default:
               break;
          }
          OldBrush = ( HBRUSH)SelectObject(hdc, MyBrush);

           switch (GRAPH)
          {
           case 0:
              Rectangle(hdc, 10, 200, 200, 300);
               break;
           case 1:
              Ellipse(hdc, 10, 200, 200, 300);
               break;
           case 2:
              MoveToEx(hdc, 10, 200, NULL);
              LineTo(hdc, 200, 300);
               break;
           default:
               break;
          }
          SelectObject(hdc, OldBrush);
          DeleteObject(MyBrush);
          EndPaint( hWnd, &ps);
           return 0;

     case WM_COMMAND:
           if ( HIWORD( wParam) == BN_CLICKED)
          {
               switch ( LOWORD( wParam))
              {
                    case ID_R1:
                        GRAPH = 0;
                         break;

                    case ID_R2:
                        GRAPH = 1;
                         break;

                    case ID_R3:
                        GRAPH = 2;
                         break;

                    case ID_R4:
                        COLOR = 0;
                         break;

                    case ID_R5:
                        COLOR = 1;
                         break;

                    case ID_R6:
                        COLOR = 2;
                         break;

                    default:
                         break;
              }
              InvalidateRect( hWnd, NULL, TRUE);
          }
           return 0;
     }

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




LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam )
{
     HDC hdc;
     PAINTSTRUCT ps;
     WCHAR str[] = TEXT( "왼쪽 클릭:에디트 이동, 오른쪽 클릭:보임/숨김");

     switch (iMessage)
     {
     case WM_CREATE:
          hEdit = CreateWindow(TEXT ("edit" ), NULL , WS_CHILD | WS_VISIBLE | WS_BORDER | ES_AUTOHSCROLL
              ,10, 10, 200, 25, hWnd, ( HMENU) ID_EDIT, g_hInst, NULL);
           return 0;

     case WM_DESTROY:
          PostQuitMessage(0);
           return 0;

     case WM_PAINT:
          hdc = BeginPaint( hWnd, &ps);
           TextOut(hdc, 200, 100, str, lstrlen(str));
          EndPaint( hWnd, &ps);
           return 0;

     case WM_LBUTTONDOWN :
          nTop += 10;
          MoveWindow(hEdit, 10, nTop, 200, 25, TRUE);
           return 0;

     case WM_RBUTTONDOWN:
           if (bShow)
          {
              bShow = FALSE;
              ShowWindow(hEdit, SW_HIDE);
          }
           else
          {
              bShow = TRUE;
              ShowWindow(hEdit, SW_SHOW);
          }
           return 0;
     }

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


■ ARM assembly


■ 함수호출규약

ARM에는 Accumulator가 따로없지만
이 레지스터들이 Accumulator 라고 볼 수 있다.

함수호출규약 - 인텔은 함수호출이 끝났을때 eax를 제외한 레지스터들의 값은
안변한다는 전제가 깔려있다.

C를 배우면 함수호출규악을 몰라도 되고 C에만 집중할 수 있다.
컴파일러가 알아서 칩 종류에 맞춰서 어셈블리 하기때문에

리턴값이 eax에 들어가는데 구조체는 4바이트를 넘어서 훨씬큰데 어떻게 들어가냐?
구조체리턴하는것도 만들어서 확인해보면 된다.

struct smart k1;
                  k2;
k1 = k2;

struct smart
{
     int a[30];
}


숙제 인텔에서는 구조체를 어떻게 대입하고 리턴하는가.


될수잇으면 구조체는 값대입을하지말고 포인터로 해야한다.

우리는 편하게 쓰는코드인데
어셈블리는 불편한 코드이다.

728x90