- ベストアンサー
アセンブリ語に関して
mov命令のパラメータの大カッコのなかには、espレジスタを指定できない決まりになっているのには、何か理由はあるのですか?
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
>自動的に値が変化する特殊レジスタをもしエフェクティブ >アドレスに指定してしまったら、自動的に値が変化しなく >なってしまうということですか? そういう話ではなく、CPUの設計思想の問題です。 「特殊レジスタも汎用レジスタも同等のレジスタにする」と言う思想で設計すれば「自動的に値が変化する特殊レジスタをエフェクティブアドレスに指定出来る」もアリになります。 実際、スタックポインタレジスタ(espに相当するレジスタ)を持たないCPUも存在します。 push eax の動きを考えてみて下さい。これは sub esp,4 mov [esp],ax (このオペランド指定は実在しない) と同等です。 call far_address は sub esp,4 mov [esp],eip (このオペランド指定は実在しない) add [esp],9 (このオペランド指定は実在しない) jmp far_address と同等です。 ぶっちゃけて言えば「pushとかcallとかソレ用の短くて専用の命令をサポートしてるんだから、espをエフェクティブアドレスに指定する必要無いよね。だから指定出来なくても良いよね」って思想でCPUを設計しただけの話です。 それに「スタックの中を参照、変更出来るようにebpレジスタを用意したので、それ使って」と設計されているのも理由の1つとしてあります。 あと、そういう特殊レジスタを汎用レジスタと同様なアドレス参照に使えるようにしたら、CPUの回路が複雑になって速度が落ちたり効率が悪い、って話もあります。
その他の回答 (1)
- chie65536
- ベストアンサー率41% (2512/6032)
espレジスタは、他のレジスタとは異なり、push命令、pop命令、call命令、ret命令などにより、自動的に値が変化する特殊レジスタです。 また、外部例外などにより制御が例外ハンドラに移る場合も、例外発生時のCPUの状態を「ss:esp」で示すメモリに退避し、例外処理後にそこから状態を取り出して復帰します。 このように、他の命令や事象によりespレジスタは特殊な使われ方をするので、エフェクティブアドレスにespレジスタは指定できません。
補足
つまり、push命令、pop命令、call命令、ret命令などにより、自動的に値が変化する特殊レジスタをもしエフェクティブアドレスに指定してしまったら、自動的に値が変化しなくなってしまうということですか?
お礼
なるほど!!そういうことだったんですね! 何となくですがイメージはうかびました。 有難うございました。また、よろしくお願いいたします!