Archive for the ‘GAS’ Category

  1. Hello, COM(GAS) World!

    Posted on 3月 18th, 2013 by cx20

    COM(GAS)

    COM(Component Object Model)はマイクロソフトの提唱するプログラム部品の仕様である。
    COM を用いて開発された部品であれば言語を問わず利用することができる。
    以下は GAS による COM クライアントの例となっている。

    ソースコード

            .file   "hello.c"
            .def    ___main;        .scl    2;      .type   32;     .endef
            .section .rdata,"dr"
            .align 4
    LC0:
            .ascii "B

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

    #include <ole2.h>
     
    int main( int argc, char* argv[] )
    {
        CLSID clsid;
        IDispatch* pShell;
        IDispatch* pFolder;
        DISPID dispid;
        OLECHAR* ptName = L"BrowseForFolder";
        DISPPARAMS param = { NULL, NULL, 0, 0 };
        VARIANT varg[4];
        VARIANT vResult;
     
        CoInitialize( NULL );
     
        CLSIDFromProgID(L"Shell.Application", &clsid );
        CoCreateInstance( &clsid, NULL, CLSCTX_INPROC_SERVER, &IID_IDispatch, (void**)&pShell);
        pShell->lpVtbl->GetIDsOfNames( (void*)pShell, &IID_NULL, &ptName, 1, GetUserDefaultLCID(), &dispid );
     
        VariantInit( &varg[0] );
        varg[0].vt = VT_I4;
        varg[0].lVal = 36L;  /* ssfWINDOWS */
     
        VariantInit( &varg[1] );
        varg[1].vt = VT_I4;
        varg[1].lVal = 0L;
     
        VariantInit( &varg[2] );
        varg[2].vt = VT_BSTR;
        varg[2].bstrVal = SysAllocString(L"Hello, COM World!"); 
     
        VariantInit( &varg[3] );
        varg[3].vt = VT_I4;
        varg[3].lVal = 0L;
     
        param.cArgs = 4;
        param.rgvarg = varg;
     
        pShell->lpVtbl->Invoke( (void*)pShell, dispid, &IID_NULL, GetUserDefaultLCID(), DISPATCH_METHOD, &param, &vResult, NULL, NULL );
     
        VariantInit( &varg[0] );
        VariantInit( &varg[1] );
        VariantInit( &varg[2] );
        VariantInit( &varg[3] );
     
        pFolder = V_DISPATCH( &vResult );
        if ( pFolder != NULL )
        {
            pFolder->lpVtbl->Release( (void*)pFolder );
        }
        pShell->lpVtbl->Release( (void*)pShell );
     
        CoUninitialize();
     
        return 0;
    }

    コンパイル&リンク方法

    C:¥> gcc -c hello.c
    C:¥> gcc -o hello hello.o -l ole32  -l oleaut32 -l uuid

    実行結果

    +----------------------------------------+
    |Browse For Folder                    [X]|
    +----------------------------------------+
    | Hello, COM Wolrd!                      |
    |                                        |
    | +------------------------------------+ |
    | |[Windows]                           | |
    | | +[addins]                          | |
    | | +[AppCompat]                       | |
    | | +[AppPatch]                        | |
    | | +[assembly]                        | |
    | |     :                              | |
    | |     :                              | |
    | |     :                              | |
    | +------------------------------------+ |
    | [Make New Folder]    [  OK  ] [Cancel] |
    +----------------------------------------+
  2. Hello, Win32 API(GAS) World!

    Posted on 3月 14th, 2013 by cx20

    Win32 API(GAS)

    Win32 API は、Windows の機能にアクセスする為の API(Application Programming Interface)である。
    以下は GAS からの呼出し例である。

    ソースコード(GAS)

            .file   "hello.c"
            .def    ___main;        .scl    2;      .type   32;     .endef
            .section .rdata,"dr"
    LC0:
            .ascii "Hello, World!

    上記コードは、下記の C のソースを MinGW版 GCC にてアセンブリコード出力(gcc -S hello.c)したものである。

    ソースコード(C言語)

    #include <windows.h>
     
    int main( int argc, char* argv[] )
    {
        MessageBox( NULL, "Hello, Win32 API World!", "Hello, World!", MB_OK );
        return 0;
    }

    コンパイル方法(MinGW版 gcc)

    C:¥> gcc -c hello.s
    C:¥> gcc -o hello hello.o

    実行結果

    ---------------------------
    Hello, World!
    ---------------------------
    Hello, Win32 API World!
    ---------------------------
    OK   
    ---------------------------
  3. Hello, GAS World!

    Posted on 1月 2nd, 2012 by cx20

    GAS

    GAS は GNU プロジェクトで使用されるアセンブリ言語である。Linux カーネルの開発にも用いられている。
    構文の特徴としては Intel 記法ではなく、AT&T 記法が使われているという特徴がある。

    ソースコード(32bit版)

            .text
            .globl  _main
    _main:
            pushl   %ebp
            movl    %esp, %ebp
            andl    $-16, %esp
            subl    $16, %esp
            call    ___main
            movl    $_msg, (%esp)
            call    _puts
            movl    $0, %eax
            leave
            ret
     
            .data
    _msg:
            .asciz  "Hello, GAS World!"

    ソースコード(64bit版)

            .text
            .globl  _main
    _main:
            pushq   %rbp
            movq    %rsp, %rbp
            leaq    _msg(%rip), %rdi
            callq   _puts
            xorl    %eax, %eax
            popq    %rbp
            ret
     
            .data
    _msg:
            .asciz  "Hello, GAS World!"

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

    #include <stdio.h>
     
    int main( int argc, char* argv[] )
    {
        printf( "Hello, GAS World!n" );
        return 0;
    }

    コンパイル&リンク方法(32bit版)

    $ gcc -c hello.s -m32
    $ gcc -o hello hello.o

    コンパイル&リンク方法(64bit版)

    $ gcc -c hello.s -m64
    $ gcc -o hello hello.o

    実行結果

    Hello, GAS World!