id:n7shi:20100201の続きです。インラインアセンブラをIntel形式にしてみました。
void start() { int m[] = { 0, 1/*EXIT*/, 42, 0, 0, 0, 0, 0, 0 }; asm("mov eax, 0; mov ecx, 3; int 0x21" :: "b"(m)); }
# gcc -masm=intel -nostdinc -nostdlib exit.c # ./a.out; echo $? 42
アセンブリ化
アセンブリを出力します。
gcc -masm=intel -nostdinc -S exit.c
出力されたexit.sを削って整理しました。
.intel_syntax .text start: mov eax, 0 mov ebx, offset flat:msg mov ecx, 3 int 0x21 msg: .long 0; .long 1; .long 42; .long 0; .long 0 .long 0; .long 0; .long 0; .long 0
# gcc -nostdlib exit.s # ./a.out; echo $? 42
C言語のバイナリは382バイトでしたが、プロローグ・エピローグ・セクションなどを削ったため311バイトに縮みました。シンボルが残っているためgstrip(stripはACKでコンパイルしたバイナリしか処理できない)で削ると、C言語は168バイト、アセンブリは104バイトとなりました。
ゴルフが目的ではないのでサイズ縮小はこのくらいにして、次はa.outファイルの解析に入っていきます。ACKではなくgccを使っているのは、単にACKの使い方が良く分からないためです。