Archive for the ‘GAS’ Category
-
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, ¶m, &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] | +----------------------------------------+
-
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 ---------------------------
-
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!