2010/06/18


golangタグが既におかしいですが...
// ; hello world on win32 writen in asm.
// ; compile: 8a helloworld.s
// ; link   : 8l -o helloworld.exe helloworld.8
// ; run    : helloworld.exe
// ; 
// ; if you get the following compile error,
// ;   maybe, namespace separator was broken by copy-and-paste.
// ; open this file with text editor as utf-8 encoding, and fix following...
// ;
// ;   main!main
// ;   main!init
// ;   runtime!printstring
// ;
// ; ! should be code point 183 in unicode.

// ; main.main
TEXT    main·main+0(SB),$16-0
LEAL    gstring+0(SB),SI
LEAL    (SP),DI
CLD     ,
MOVSL   ,
MOVSL   ,
CALL    ,runtime·printstring+0(SB)
RET

// ; main.init
TEXT    main·init+0(SB),$4-0
RET

// ; data for native
GLOBL   string+0(SB),$14
DATA    string+0(SB)/8,$"hello, w"
DATA    string+8(SB)/7,$"orld!\n\z"

// ; data for gostring
GLOBL   gstring+0(SB),$8
DATA    gstring+0(SB)/4,$string+0(SB)
DATA    gstring+4(SB)/4,$13
END     ,
goではplan9形式のアセンブリで書けば8a(6a)でコンパイルでき、8l(6l)でリンク出来るので、上のソースをコンパイルすると見事に「hello, world!」と表示される。plan9のアセンブリってアライメントが必要なのね...。あと文字列リソースはgostring用と分けて書かないとlengthが違っちゃうみたい。

途中にある変な文字「·」はutf-8で183のコードポイントです。
gist: 434256 - GitHub

hello world on win32 writen in asm.

http://gist.github.com/434256
Posted at by




tyruさんが既に記事にしてくれてますが、こちらでも。
mattnさんが前の記事にコードで回答してくれた - おつあり

mattnさんが前の記事にコードで回答してくれた Vim mattn’s libcallex-vim at master - GitHub こんなリポジトリが作られたので十中八九僕のlibcall()...

http://d.hatena.ne.jp/tyru/20100518/cool_mattn
通常 libcall は引数が1つしか扱えないのですが、内部でJSONでやりとりしてC言語で書いた呼び出しproxyを介して外部ライブラリ(DLL等)の関数を呼び出せます。
とはいってもvimで扱える型しか対応していませんが、ちょっと無茶すればいろんな事が出来ます。
例えばuser32.dllのMessageBoxAを実行したり... so ../libcallex.vim

silent unlet! lib

let lib = libcallex.load('msvcrt.dll')
let username = lib.call('getenv', ["USERNAME"], 'string')
call libcallex.free(lib)

let lib = libcallex.load("user32.dll")
if lib.call('MessageBoxA', [0, "Hello ".username."\r\nCan you see this message?", 'Hello World', 4]) == 6
  call lib.call('MessageBoxA', [0, 'You clicked "YES"', 'Hello World', 0])
else
  call lib.call('MessageBoxA', [0, 'You clicked "NO". Are you all right?', 'Hello World', 0])
endif
call libcallex.free(lib)
バッファを引数に取る関数を呼び出してWindowsのSystemディレクトリを取得したり... so ../libcallex.vim

silent unlet! lib

let lib = libcallex.load('kernel32.dll')

let buf = repeat(' ', 255)
let args = [buf, 255]
call lib.call('GetWindowsDirectoryA', args, 'number')
let dir = args[0]
echo "your windows directory: " . dir

let buf = repeat(' ', 255)
let args = [buf, 255]
call lib.call('GetSystemDirectoryA', args, 'number')
let dir = args[0]
echo "your system directory : " . dir

call libcallex.free(lib)
無理やりlongのポインタ作ってバッファ書き込み数を参照渡しで扱う関数を呼び出したり... so ../libcallex.vim

silent unlet! msvcrt
silent unlet! advapi32

let msvcrt = libcallex.load('msvcrt.dll')
let advapi32 = libcallex.load('advapi32.dll')

" make address of variable which is stored 256
let ptr = float2nr(eval(msvcrt.call('malloc', [4], 'number')))
call msvcrt.call('memset', [ptr, 0, 4], 'number')
call msvcrt.call('memset', [ptr+1, 1, 1], 'number')

let buf = repeat(' ', 256)
let args = [buf, ptr]
call advapi32.call('GetUserNameA', args, 'number')
let username = args[0]

call msvcrt.call('free', [ptr], 'number')

call libcallex.free(advapi32)
call libcallex.free(msvcrt)

echo username
出来ます。(まぁ最後のはやりすぎとして)
分かる人は想像通りですが、簡単なインラインアセンブラで実現してます。
いままでvimからDLL呼び出しが出来ないと悩んでおられた方には有用かもしれません。

えっ?mattnとtyruさんだけだって?
Posted at by




知っている人もいるだろうけど、一応こっちでも宣伝。
os0xさんがSafariで拡張を作る方法をまとめてくれたので、すんなり出来ました。
Safari拡張の作り方 - 0xFF

Safari拡張の作り方 Safari, extension Safari拡張をいくつか作って大体感覚は掴めたので、ざっくりと拡張の作成手順を解説してみます。 なお、Windows版で作業していますが...

http://d.hatena.ne.jp/os0x/20100610/1276119135
作業時間も30分程度だった気がする。
mattn's safari-grff at master - GitHub

Google Reader Full Feed for Safari

http://github.com/mattn/safari-grff
Safari5で動きます。パッケージングしたものをDownloadから落とせるので、使ってみたい人はどうぞ。
ソースも一緒の所にあるので良かったらみて下さい。正直Chrome版とほぼ同じです。
Posted at by