x86のレジスタについての簡単なまとめ
x86には8つの汎用レジスタがある。
各レジスタには使用目的があるので、それに応じて使い分けることでコードが分かりやすくなるし、命令も最適化される。また同じ命令がたくさん並ぶことになるので、圧縮の効率も上がる。
って http://www.swansontec.com/sregisters.html が言ってます。
名前 | 英語名 | 使用目的 | 用意されている専用命令 |
---|---|---|---|
EAX | Accumulator Register | 戻り値や演算など | movやxchgやaddやxorなど、移動やスワップや各種計算 |
EBX | Base Register | アドレスを指す | 特殊なのは16bit-modeのときだけで、32bit-modeのときはただの汎用レジスタ |
ECX | Count Resister | 繰り返しの回数 | loopやrepやjcxzなど、繰り返しやジャンプ条件 |
EDX | Data Resister | データの一時退避や演算など | mulやdivや64bit計算など、EAXだけでは足りないものに使われる。計算に使わせておくと便利 |
EDI | Destination Index | 書き込み先アドレス | ESIとセット。movsなど、連続して移動する書き込みの際の目的アドレスを格納。ただの汎用レジスタとして使うのはもったいない! |
ESI | Source Index | 読み込み元アドレス/汎用 | EDIとセット。movsなど、連続して移動する読み込みの際の目的アドレスを格納。読み込み元がないなら汎用レジスタでもOK |
ESP | Stack Pointer | スタック端 | pushすると減って、popすると増える。自動的に。スタック端のアドレスを自動的に表してくれるので、むやみに自分で触らない |
EBP | Base Pointer | フレーム開始位置 | 引数やローカル変数を指定する際の基準アドレスを格納する。つまり関数呼び出し中は変化しない |
元の英文がめっちゃ分かりやすいので、是非読んで。
http://www.swansontec.com/sregisters.html