Curious x86 call instruction.

by syoyo

(更新: 解決しました)

Compile this test program,

with gcc -O2 -c which results in following x86 assembly.

I got curious call instruction(call 0x9).
What does this call stands for? It seems that this call insn is used to align stack or PC(program counter).

[Ja]

x86toLLVM を作ろうとしていて x86 アセンブラと戯れていたら、
不思議な x86 アセンブラに遭遇しました.

上記の 5 行目の call 命令です.
特段関数を呼ぶためでもなくて、単純に 4 バイト目から 9 バイト目に飛んでいるだけ.
このテストプログラム以外にも、結構いろんなプログラムのアセンブリ結果に
この単にすぐ近くのアドレスに飛ぶために使われる不思議な call 命令が出てきます.

なんだろう? アラインをそろえたり、プログラムカウンタを合わせるためなのかな?
でもそれだったら nop 命令でいい気がするんだけれども.
call はコストがかかりそうな命令だし
(それともこのような近いアドレスへの call は CPU 内部で最適化されているのか?).

gcc の i386.c をざっとみてみましたが、いろいろ call 関連がありすぎてよくわかりませんでした.

こういうのは誰に聞いたらいいんだろう…

と、少し探してみたら comp.lang.asm.x86 というなんともビンゴそうなグループが!
ここでちょっと聞いてみることにしてみようかと思います.

Advertisements