アセンブリ言語をアセンブルするときのメモ
環境:ubunut 15.04(64bit)
学校の授業でアセンブリ言語がある。自分の環境でも書けるようにしておきたいがどうもアセンブリ言語は環境移植性が低いらしくそのまま
gcc -S a.c
とかすると下のようになってしまう。
int func(int n){ return n+5; }
.file "a.c" .text .globl func .type func, @function func: .LFB0: .cfi_startproc pushl %ebp .cfi_def_cfa_offset 8 .cfi_offset 5, -8 movl %esp, %ebp .cfi_def_cfa_register 5 movl 8(%ebp), %eax addl $5, %eax popl %ebp .cfi_restore 5 .cfi_def_cfa 4, 4 ret .cfi_endproc .LFE0: .size func, .-func .ident "GCC: (Ubuntu 5.1.1-4ubuntu12) 5.1.1 20150504" .section .note.GNU-stack,"",@progbits
授業ではMacOSX GCC-4.2.1で32bit用i386コードにするらしい。
うーん何を言っているかよくわからない。どうしたものか。
そこで某「怖い人」に聞くと自分の環境でもそれなりに近いコードを吐けるらしい
次のようにコンパイルすればいい
gcc -m32 -S -O0 -fno-asynchronous-unwind-tables a.c
それぞれのコンパイラオプションは「32bit用i386コード」「アセンブリ」「最適化無効」、最後の長いオプションはよくわからないけど
http://www.cqpub.co.jp/interface/column/freesoft/2004/200402/0.htm
に一応書いてある。(これをつけるとドットから始まる命令が一気に減った)
このコンパイラオプションを付けてコードを吐き出すと次のようになる。
.file "a.c" .text .globl func .type func, @function func: pushl %ebp movl %esp, %ebp movl 8(%ebp), %eax addl $5, %eax popl %ebp ret .size func, .-func .ident "GCC: (Ubuntu 5.1.1-4ubuntu12) 5.1.1 20150504" .section .note.GNU-stack,"",@progbits
うん。綺麗になった。
.sファイルをコンパイルして実行ファイルを作るときは
gcc -m32 a.s
とかすればよさそう(適当)
最近
うーん。最近周りの怖い人達に頼りきってる気がするぞ。申し訳ないから頑張らなくては。