Hello, DirectX(MASM) World!

Posted on 7月 27th, 2012 by cx20

Win32 DirectX(MASM)

DirectX はマイクロソフトが Wnidows 用に開発したマルチメディア処理用 API である。
以下は MSAM における DirectX アプリケーション の例となっている。

ソースコード

; Listing generated by Microsoft (R) Optimizing Compiler Version 14.00.50727.762 
 
        TITLE   hello.c
        .686P
        .XMM
        include listing.inc
        .model  flat
 
INCLUDELIB LIBCMT
INCLUDELIB OLDNAMES
 
PUBLIC  _g_pD3D
PUBLIC  _g_pd3dDevice
PUBLIC  _g_pd3dFont
PUBLIC  _g_rect
_BSS    SEGMENT
_g_pD3D DD      01H DUP (?)
_g_pd3dDevice DD 01H DUP (?)
_g_pd3dFont DD  01H DUP (?)
_g_rect DB      010H DUP (?)
_BSS    ENDS
_DATA   SEGMENT
$SG94060 DB     082H, 'l', 082H, 'r ', 083H, 'S', 083H, 'V', 083H, 'b', 083H
        DB      'N', 00H
        ORG $+2
$SG94064 DB     'Hello, DirectX(MASM) World!', 00H
$SG94084 DB     'Hello, DirectX(MASM) World!', 00H
$SG94116 DB     'helloWindow', 00H
$SG94118 DB     'Hello, World!', 00H
_DATA   ENDS
PUBLIC  _InitD3D
EXTRN   _Direct3DCreate9@4:PROC
; Function compile flags: /Odtp
_TEXT   SEGMENT
_d3dpp$ = -60                                           ; size = 56
_hr$ = -4                                               ; size = 4
_hWnd$ = 8                                              ; size = 4
_InitD3D PROC
; File hello.c
; Line 17
        push    ebp
        mov     ebp, esp
        sub     esp, 60                                 ; 0000003cH
; Line 20
        push    32                                      ; 00000020H
        call    _Direct3DCreate9@4
        mov     DWORD PTR _g_pD3D, eax
; Line 21
        cmp     DWORD PTR _g_pD3D, 0
        jne     SHORT $LN2@InitD3D
; Line 23
        mov     eax, -2147467259                        ; 80004005H
        jmp     $LN3@InitD3D
$LN2@InitD3D:
; Line 26
        mov     DWORD PTR _d3dpp$[ebp], 0
; Line 27
        mov     DWORD PTR _d3dpp$[ebp+4], 0
; Line 28
        mov     DWORD PTR _d3dpp$[ebp+8], 0
; Line 29
        mov     DWORD PTR _d3dpp$[ebp+12], 0
; Line 30
        mov     DWORD PTR _d3dpp$[ebp+16], 0
; Line 31
        mov     DWORD PTR _d3dpp$[ebp+20], 0
; Line 32
        mov     DWORD PTR _d3dpp$[ebp+24], 1
; Line 33
        mov     DWORD PTR _d3dpp$[ebp+28], 0
; Line 34
        mov     DWORD PTR _d3dpp$[ebp+32], 1
; Line 35
        mov     DWORD PTR _d3dpp$[ebp+36], 0
; Line 36
        mov     DWORD PTR _d3dpp$[ebp+40], 0
; Line 37
        mov     DWORD PTR _d3dpp$[ebp+44], 0
; Line 38
        mov     DWORD PTR _d3dpp$[ebp+48], 0
; Line 39
        mov     DWORD PTR _d3dpp$[ebp+52], 0
; Line 49
        push    OFFSET _g_pd3dDevice
        lea     eax, DWORD PTR _d3dpp$[ebp]
        push    eax
        push    32                                      ; 00000020H
        mov     ecx, DWORD PTR _hWnd$[ebp]
        push    ecx
        push    1
        push    0
        mov     edx, DWORD PTR _g_pD3D
        push    edx
        mov     eax, DWORD PTR _g_pD3D
        mov     ecx, DWORD PTR [eax]
        mov     edx, DWORD PTR [ecx+64]
        call    edx
        mov     DWORD PTR _hr$[ebp], eax
; Line 51
        cmp     DWORD PTR _hr$[ebp], 0
        jge     SHORT $LN1@InitD3D
; Line 53
        mov     eax, -2147467259                        ; 80004005H
        jmp     SHORT $LN3@InitD3D
$LN1@InitD3D:
; Line 56
        xor     eax, eax
$LN3@InitD3D:
; Line 57
        mov     esp, ebp
        pop     ebp
        ret     0
_InitD3D ENDP
_TEXT   ENDS
PUBLIC  _Cleanup
PUBLIC  __$ArrayPad$
PUBLIC  _InitFont
EXTRN   _D3DXCreateFontIndirectA@12:PROC
EXTRN   __imp__lstrcpyA@8:PROC
EXTRN   ___security_cookie:DWORD
EXTRN   @__security_check_cookie@4:PROC
; Function compile flags: /Odtp
_TEXT   SEGMENT
_hr$ = -64                                              ; size = 4
_lf$ = -60                                              ; size = 56
__$ArrayPad$ = -4                                       ; size = 4
_InitFont PROC
; Line 60
        push    ebp
        mov     ebp, esp
        sub     esp, 64                                 ; 00000040H
        mov     eax, DWORD PTR ___security_cookie
        xor     eax, ebp
        mov     DWORD PTR __$ArrayPad$[ebp], eax
; Line 64
        mov     DWORD PTR _lf$[ebp], 16                 ; 00000010H
; Line 65
        mov     DWORD PTR _lf$[ebp+4], 0
; Line 66
        mov     DWORD PTR _lf$[ebp+8], 0
; Line 67
        mov     DWORD PTR _lf$[ebp+12], 1
; Line 68
        mov     DWORD PTR _lf$[ebp+16], 0
; Line 69
        mov     BYTE PTR _lf$[ebp+20], 128              ; 00000080H
; Line 70
        mov     BYTE PTR _lf$[ebp+21], 7
; Line 71
        mov     BYTE PTR _lf$[ebp+22], 2
; Line 72
        mov     BYTE PTR _lf$[ebp+23], 49               ; 00000031H
; Line 73
        push    OFFSET $SG94060
        lea     eax, DWORD PTR _lf$[ebp+24]
        push    eax
        call    DWORD PTR __imp__lstrcpyA@8
; Line 75
        push    OFFSET _g_pd3dFont
        lea     ecx, DWORD PTR _lf$[ebp]
        push    ecx
        mov     edx, DWORD PTR _g_pd3dDevice
        push    edx
        call    _D3DXCreateFontIndirectA@12
        mov     DWORD PTR _hr$[ebp], eax
; Line 76
        cmp     DWORD PTR _hr$[ebp], 0
        jge     SHORT $LN2@InitFont
; Line 78
        call    _Cleanup
; Line 79
        mov     eax, DWORD PTR _hr$[ebp]
        jmp     SHORT $LN3@InitFont
$LN2@InitFont:
; Line 90
        push    -1
        push    1056                                    ; 00000420H
        push    OFFSET _g_rect
        push    -1
        push    OFFSET $SG94064
        push    0
        mov     eax, DWORD PTR _g_pd3dFont
        push    eax
        mov     ecx, DWORD PTR _g_pd3dFont
        mov     edx, DWORD PTR [ecx]
        mov     eax, DWORD PTR [edx+56]
        call    eax
        mov     DWORD PTR _hr$[ebp], eax
; Line 92
        cmp     DWORD PTR _hr$[ebp], 0
        jge     SHORT $LN1@InitFont
; Line 94
        call    _Cleanup
; Line 95
        mov     eax, DWORD PTR _hr$[ebp]
        jmp     SHORT $LN3@InitFont
$LN1@InitFont:
; Line 98
        mov     eax, DWORD PTR _hr$[ebp]
$LN3@InitFont:
; Line 99
        mov     ecx, DWORD PTR __$ArrayPad$[ebp]
        xor     ecx, ebp
        call    @__security_check_cookie@4
        mov     esp, ebp
        pop     ebp
        ret     0
_InitFont ENDP
; Function compile flags: /Odtp
_Cleanup PROC
; Line 102
        push    ebp
        mov     ebp, esp
; Line 103
        cmp     DWORD PTR _g_pd3dFont, 0
        je      SHORT $LN3@Cleanup
; Line 105
        mov     eax, DWORD PTR _g_pd3dFont
        push    eax
        mov     ecx, DWORD PTR _g_pd3dFont
        mov     edx, DWORD PTR [ecx]
        mov     eax, DWORD PTR [edx+8]
        call    eax
$LN3@Cleanup:
; Line 108
        cmp     DWORD PTR _g_pd3dDevice, 0
        je      SHORT $LN2@Cleanup
; Line 110
        mov     ecx, DWORD PTR _g_pd3dDevice
        push    ecx
        mov     edx, DWORD PTR _g_pd3dDevice
        mov     eax, DWORD PTR [edx]
        mov     ecx, DWORD PTR [eax+8]
        call    ecx
$LN2@Cleanup:
; Line 113
        cmp     DWORD PTR _g_pD3D, 0
        je      SHORT $LN4@Cleanup
; Line 115
        mov     edx, DWORD PTR _g_pD3D
        push    edx
        mov     eax, DWORD PTR _g_pD3D
        mov     ecx, DWORD PTR [eax]
        mov     edx, DWORD PTR [ecx+8]
        call    edx
$LN4@Cleanup:
; Line 117
        pop     ebp
        ret     0
_Cleanup ENDP
_TEXT   ENDS
PUBLIC  __real@3f800000
PUBLIC  _Render
EXTRN   __fltused:DWORD
;       COMDAT __real@3f800000
CONST   SEGMENT
__real@3f800000 DD 03f800000r                   ; 1
; Function compile flags: /Odtp
CONST   ENDS
_TEXT   SEGMENT
_Render PROC
; Line 120
        push    ebp
        mov     ebp, esp
; Line 121
        cmp     DWORD PTR _g_pd3dDevice, 0
        jne     SHORT $LN3@Render
; Line 123
        jmp     $LN4@Render
$LN3@Render:
; Line 126
        cmp     DWORD PTR _g_pd3dFont, 0
        jne     SHORT $LN2@Render
; Line 128
        jmp     $LN4@Render
$LN2@Render:
; Line 139
        push    0
        push    ecx
        fld1
        fstp    DWORD PTR [esp]
        push    -16776961                               ; ff0000ffH
        push    1
        push    0
        push    0
        mov     eax, DWORD PTR _g_pd3dDevice
        push    eax
        mov     ecx, DWORD PTR _g_pd3dDevice
        mov     edx, DWORD PTR [ecx]
        mov     eax, DWORD PTR [edx+172]
        call    eax
; Line 141
        mov     ecx, DWORD PTR _g_pd3dDevice
        push    ecx
        mov     edx, DWORD PTR _g_pd3dDevice
        mov     eax, DWORD PTR [edx]
        mov     ecx, DWORD PTR [eax+164]
        call    ecx
        test    eax, eax
        jl      SHORT $LN1@Render
; Line 151
        push    -1
        push    32                                      ; 00000020H
        push    OFFSET _g_rect
        push    -1
        push    OFFSET $SG94084
        push    0
        mov     edx, DWORD PTR _g_pd3dFont
        push    edx
        mov     eax, DWORD PTR _g_pd3dFont
        mov     ecx, DWORD PTR [eax]
        mov     edx, DWORD PTR [ecx+56]
        call    edx
; Line 153
        mov     eax, DWORD PTR _g_pd3dDevice
        push    eax
        mov     ecx, DWORD PTR _g_pd3dDevice
        mov     edx, DWORD PTR [ecx]
        mov     eax, DWORD PTR [edx+168]
        call    eax
$LN1@Render:
; Line 156
        push    0
        push    0
        push    0
        push    0
        mov     ecx, DWORD PTR _g_pd3dDevice
        push    ecx
        mov     edx, DWORD PTR _g_pd3dDevice
        mov     eax, DWORD PTR [edx]
        mov     ecx, DWORD PTR [eax+68]
        call    ecx
$LN4@Render:
; Line 157
        pop     ebp
        ret     0
_Render ENDP
_TEXT   ENDS
PUBLIC  _WndProc@16
EXTRN   __imp__DefWindowProcA@16:PROC
EXTRN   __imp__ValidateRect@8:PROC
EXTRN   __imp__PostQuitMessage@4:PROC
; Function compile flags: /Odtp
_TEXT   SEGMENT
tv64 = -4                                               ; size = 4
_hWnd$ = 8                                              ; size = 4
_message$ = 12                                          ; size = 4
_wParam$ = 16                                           ; size = 4
_lParam$ = 20                                           ; size = 4
_WndProc@16 PROC
; Line 160
        push    ebp
        mov     ebp, esp
        push    ecx
; Line 161
        mov     eax, DWORD PTR _message$[ebp]
        mov     DWORD PTR tv64[ebp], eax
        cmp     DWORD PTR tv64[ebp], 2
        je      SHORT $LN2@WndProc
        cmp     DWORD PTR tv64[ebp], 15                 ; 0000000fH
        je      SHORT $LN1@WndProc
        jmp     SHORT $LN3@WndProc
$LN2@WndProc:
; Line 164
        call    _Cleanup
; Line 165
        push    0
        call    DWORD PTR __imp__PostQuitMessage@4
; Line 166
        xor     eax, eax
        jmp     SHORT $LN5@WndProc
$LN1@WndProc:
; Line 169
        call    _Render
; Line 170
        push    0
        mov     ecx, DWORD PTR _hWnd$[ebp]
        push    ecx
        call    DWORD PTR __imp__ValidateRect@8
; Line 171
        xor     eax, eax
        jmp     SHORT $LN5@WndProc
$LN3@WndProc:
; Line 174
        mov     edx, DWORD PTR _lParam$[ebp]
        push    edx
        mov     eax, DWORD PTR _wParam$[ebp]
        push    eax
        mov     ecx, DWORD PTR _message$[ebp]
        push    ecx
        mov     edx, DWORD PTR _hWnd$[ebp]
        push    edx
        call    DWORD PTR __imp__DefWindowProcA@16
$LN5@WndProc:
; Line 175
        mov     esp, ebp
        pop     ebp
        ret     16                                      ; 00000010H
_WndProc@16 ENDP
_TEXT   ENDS
PUBLIC  _WinMain@16
EXTRN   __imp__DispatchMessageA@4:PROC
EXTRN   __imp__TranslateMessage@4:PROC
EXTRN   __imp__GetMessageA@16:PROC
EXTRN   __imp__UpdateWindow@4:PROC
EXTRN   __imp__ShowWindow@8:PROC
EXTRN   __imp__CreateWindowExA@48:PROC
EXTRN   __imp__RegisterClassExA@4:PROC
EXTRN   __imp__LoadCursorA@8:PROC
EXTRN   __imp__LoadIconA@8:PROC
; Function compile flags: /Odtp
_TEXT   SEGMENT
_lpszClassName$ = -88                                   ; size = 4
_msg$ = -84                                             ; size = 28
_wcex$ = -56                                            ; size = 48
_hWnd$ = -8                                             ; size = 4
_lpszWindowName$ = -4                                   ; size = 4
_hInstance$ = 8                                         ; size = 4
_hPrevInstance$ = 12                                    ; size = 4
_lpCmdLine$ = 16                                        ; size = 4
_nCmdShow$ = 20                                         ; size = 4
_WinMain@16 PROC
; Line 178
        push    ebp
        mov     ebp, esp
        sub     esp, 88                                 ; 00000058H
; Line 179
        mov     DWORD PTR _lpszClassName$[ebp], OFFSET $SG94116
; Line 180
        mov     DWORD PTR _lpszWindowName$[ebp], OFFSET $SG94118
; Line 185
        mov     DWORD PTR _wcex$[ebp], 48               ; 00000030H
; Line 186
        mov     DWORD PTR _wcex$[ebp+4], 3
; Line 187
        mov     DWORD PTR _wcex$[ebp+8], OFFSET _WndProc@16
; Line 188
        mov     DWORD PTR _wcex$[ebp+12], 0
; Line 189
        mov     DWORD PTR _wcex$[ebp+16], 0
; Line 190
        mov     eax, DWORD PTR _hInstance$[ebp]
        mov     DWORD PTR _wcex$[ebp+20], eax
; Line 191
        push    32512                                   ; 00007f00H
        mov     ecx, DWORD PTR _hInstance$[ebp]
        push    ecx
        call    DWORD PTR __imp__LoadIconA@8
        mov     DWORD PTR _wcex$[ebp+24], eax
; Line 192
        push    32512                                   ; 00007f00H
        push    0
        call    DWORD PTR __imp__LoadCursorA@8
        mov     DWORD PTR _wcex$[ebp+28], eax
; Line 193
        mov     DWORD PTR _wcex$[ebp+32], 6
; Line 194
        mov     DWORD PTR _wcex$[ebp+36], 0
; Line 195
        mov     edx, DWORD PTR _lpszClassName$[ebp]
        mov     DWORD PTR _wcex$[ebp+40], edx
; Line 196
        push    32512                                   ; 00007f00H
        mov     eax, DWORD PTR _hInstance$[ebp]
        push    eax
        call    DWORD PTR __imp__LoadIconA@8
        mov     DWORD PTR _wcex$[ebp+44], eax
; Line 198
        lea     ecx, DWORD PTR _wcex$[ebp]
        push    ecx
        call    DWORD PTR __imp__RegisterClassExA@4
; Line 205
        push    0
        mov     edx, DWORD PTR _hInstance$[ebp]
        push    edx
        push    0
        push    0
        push    480                                     ; 000001e0H
        push    640                                     ; 00000280H
        push    -2147483648                             ; 80000000H
        push    -2147483648                             ; 80000000H
        push    13565952                                ; 00cf0000H
        mov     eax, DWORD PTR _lpszWindowName$[ebp]
        push    eax
        mov     ecx, DWORD PTR _lpszClassName$[ebp]
        push    ecx
        push    0
        call    DWORD PTR __imp__CreateWindowExA@48
        mov     DWORD PTR _hWnd$[ebp], eax
; Line 207
        mov     edx, DWORD PTR _hWnd$[ebp]
        push    edx
        call    _InitD3D
        add     esp, 4
; Line 208
        call    _InitFont
; Line 210
        push    10                                      ; 0000000aH
        mov     eax, DWORD PTR _hWnd$[ebp]
        push    eax
        call    DWORD PTR __imp__ShowWindow@8
; Line 211
        mov     ecx, DWORD PTR _hWnd$[ebp]
        push    ecx
        call    DWORD PTR __imp__UpdateWindow@4
$LN2@WinMain:
; Line 213
        push    0
        push    0
        push    0
        lea     edx, DWORD PTR _msg$[ebp]
        push    edx
        call    DWORD PTR __imp__GetMessageA@16
        test    eax, eax
        je      SHORT $LN1@WinMain
; Line 215
        lea     eax, DWORD PTR _msg$[ebp]
        push    eax
        call    DWORD PTR __imp__TranslateMessage@4
; Line 216
        lea     ecx, DWORD PTR _msg$[ebp]
        push    ecx
        call    DWORD PTR __imp__DispatchMessageA@4
; Line 217
        jmp     SHORT $LN2@WinMain
$LN1@WinMain:
; Line 219
        xor     eax, eax
; Line 220
        mov     esp, ebp
        pop     ebp
        ret     16                                      ; 00000010H
_WinMain@16 ENDP
_TEXT   ENDS
END

上記コードは以下のC言語のソースを VC++ でアセンブリコード出力(cl /FA hello.c)したものに相当する。

ソースコード

#include <windows.h>
#include <tchar.h>
#include <d3d9.h>
#include <d3dx9.h>
 
LPDIRECT3D9         g_pD3D       = NULL;
LPDIRECT3DDEVICE9   g_pd3dDevice = NULL;
LPD3DXFONT          g_pd3dFont   = NULL;
RECT                g_rect       = { 0, 0, 0, 0 };
 
HRESULT InitD3D( HWND hWnd );
HRESULT InitFont();
VOID Cleanup();
VOID Render();
 
HRESULT InitD3D( HWND hWnd )
{
    HRESULT hr;
    D3DPRESENT_PARAMETERS d3dpp;
    g_pD3D = Direct3DCreate9( D3D_SDK_VERSION );
    if( g_pD3D == NULL )
    {
        return E_FAIL;
    }
 
    d3dpp.BackBufferWidth             = 0;
    d3dpp.BackBufferHeight            = 0;
    d3dpp.BackBufferFormat            = D3DFMT_UNKNOWN;
    d3dpp.BackBufferCount             = 0;
    d3dpp.MultiSampleType             = D3DMULTISAMPLE_NONE;
    d3dpp.MultiSampleQuality          = 0;
    d3dpp.SwapEffect                  = D3DSWAPEFFECT_DISCARD;
    d3dpp.hDeviceWindow               = NULL;
    d3dpp.Windowed                    = TRUE;
    d3dpp.EnableAutoDepthStencil      = 0;
    d3dpp.AutoDepthStencilFormat      = D3DFMT_UNKNOWN;
    d3dpp.Flags                       = 0;
    d3dpp.FullScreen_RefreshRateInHz  = 0;
    d3dpp.PresentationInterval        = 0;
 
    hr = g_pD3D->lpVtbl->CreateDevice(
        g_pD3D,
        D3DADAPTER_DEFAULT,
        D3DDEVTYPE_HAL,
        hWnd,
        D3DCREATE_SOFTWARE_VERTEXPROCESSING,
        &d3dpp,
        &g_pd3dDevice
    );
 
    if( FAILED( hr ) )
    {
        return E_FAIL;
    }
 
    return S_OK;
}
 
HRESULT InitFont()
{
    HRESULT hr;
 
    D3DXFONT_DESC lf;
    lf.Height          = 16;
    lf.Width           = 0;
    lf.Weight          = 0;
    lf.MipLevels       = 1;
    lf.Italic          = 0;
    lf.CharSet         = SHIFTJIS_CHARSET;
    lf.OutputPrecision = OUT_TT_ONLY_PRECIS;
    lf.Quality         = PROOF_QUALITY;
    lf.PitchAndFamily  = FIXED_PITCH | FF_MODERN;
    lstrcpy( lf.FaceName, _T("MS ゴシック") );
 
    hr = D3DXCreateFontIndirect( g_pd3dDevice, &lf, &g_pd3dFont );
    if ( FAILED( hr ) )
    {
        Cleanup();
        return hr;
    }
 
    hr = g_pd3dFont->lpVtbl->DrawText(
        g_pd3dFont,
        NULL, 
        _T("Hello, DirectX(MASM) World!"),
        -1,
        &g_rect,
        DT_CALCRECT | DT_LEFT | DT_SINGLELINE,
        0xffffffff
    );
 
    if ( FAILED( hr ) )
    {
        Cleanup();
        return hr;
    }
 
    return hr;
}
 
VOID Cleanup()
{
    if ( g_pd3dFont != NULL )
    {
        g_pd3dFont->lpVtbl->Release( g_pd3dFont );
    }
 
    if( g_pd3dDevice != NULL )
    {
        g_pd3dDevice->lpVtbl->Release( g_pd3dDevice );
    }
 
    if( g_pD3D != NULL )
    {
        g_pD3D->lpVtbl->Release( g_pD3D );
    }
}
 
VOID Render()
{
    if( g_pd3dDevice == NULL )
    {
        return;
    }
 
    if ( g_pd3dFont == NULL )
    {
        return;
    }
 
    g_pd3dDevice->lpVtbl->Clear(
        g_pd3dDevice,
        0, 
        NULL,
        D3DCLEAR_TARGET,
        D3DCOLOR_XRGB( 0, 0, 255 ),
        1.0f,
        0
    );
 
    if( SUCCEEDED( g_pd3dDevice->lpVtbl->BeginScene( g_pd3dDevice ) ) )
    {
        g_pd3dFont->lpVtbl->DrawText( 
            g_pd3dFont,
            NULL,
            _T("Hello, DirectX(MASM) World!"),
            -1,
            &g_rect,
            DT_LEFT | DT_SINGLELINE,
            0xffffffff
        );
 
        g_pd3dDevice->lpVtbl->EndScene( g_pd3dDevice );
    }
 
    g_pd3dDevice->lpVtbl->Present( g_pd3dDevice, NULL, NULL, NULL, NULL );
}
 
LRESULT CALLBACK WndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam )
{
    switch( message )
    {
        case WM_DESTROY:
            Cleanup();
            PostQuitMessage( 0 );
            return 0;
 
        case WM_PAINT:
            Render();
            ValidateRect( hWnd, NULL );
            return 0;
    }
 
    return DefWindowProc( hWnd, message, wParam, lParam );
}
 
int APIENTRY _tWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow )
{
    LPCTSTR lpszClassName = _T("helloWindow");
    LPCTSTR lpszWindowName = _T("Hello, World!");
    MSG msg;
    HWND hWnd;
 
    WNDCLASSEX wcex;
    wcex.cbSize = sizeof(WNDCLASSEX);
    wcex.style          = CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc    = WndProc;
    wcex.cbClsExtra     = 0;
    wcex.cbWndExtra     = 0;
    wcex.hInstance      = hInstance;
    wcex.hIcon          = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APPLICATION));
    wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
    wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
    wcex.lpszMenuName   = NULL;
    wcex.lpszClassName  = lpszClassName;
    wcex.hIconSm        = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APPLICATION));
 
    RegisterClassEx(&wcex);
    hWnd = CreateWindow(
        lpszClassName,
        lpszWindowName,
        WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, CW_USEDEFAULT, 640, 480,
        NULL, NULL, hInstance, NULL
    );
 
    InitD3D( hWnd );
    InitFont();
 
    ShowWindow( hWnd, SW_SHOWDEFAULT );
    UpdateWindow( hWnd );
 
    while( GetMessage( &msg, NULL, 0, 0 ) )
    {
        TranslateMessage( &msg );
        DispatchMessage( &msg );
    }
 
    return 0;
}

コンパイル方法

C:¥> SET INCLUDE=%DXSDK_DIR%INCLUDE;%INCLUDE%
C:¥> SET LIB=%DXSDK_DIR%Libx86;%LIB%
C:¥> ml hello.asm ^
         /link ^
         user32.lib ^
         dxguid.lib ^
         d3d9.lib ^
         d3dx9.lib ^
         /SUBSYSTEM:WINDOWS

実行結果

+------------------------------------------+
|Hello, World!                    [_][~][X]|
+------------------------------------------+
|Hello, DirectX(MASM) World!               |
|                                          |
|                                          |
|                                          |
|                                          |
|                                          |
|                                          |
|                                          |
|                                          |
|                                          |
+------------------------------------------+

Tags:

Categories: DirectX, MASM

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

WP-SpamFree by Pole Position Marketing