読者です 読者をやめる 読者になる 読者になる

ちゃっくのメモ帳

ちゃっくがメモしときたいことをメモしとくよ

アセンブリ言語をアセンブルするときのメモ

環境: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

とかすればよさそう(適当)

最近

うーん。最近周りの怖い人達に頼りきってる気がするぞ。申し訳ないから頑張らなくては。