重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

mov命令のパラメータの大カッコのなかには、espレジスタを指定できない決まりになっているのには、何か理由はあるのですか?

A 回答 (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の回路が複雑になって速度が落ちたり効率が悪い、って話もあります。
    • good
    • 0
この回答へのお礼

なるほど!!そういうことだったんですね!
何となくですがイメージはうかびました。
有難うございました。また、よろしくお願いいたします!

お礼日時:2006/01/19 09:42

espレジスタは、他のレジスタとは異なり、push命令、pop命令、call命令、ret命令などにより、自動的に値が変化する特殊レジスタです。



また、外部例外などにより制御が例外ハンドラに移る場合も、例外発生時のCPUの状態を「ss:esp」で示すメモリに退避し、例外処理後にそこから状態を取り出して復帰します。

このように、他の命令や事象によりespレジスタは特殊な使われ方をするので、エフェクティブアドレスにespレジスタは指定できません。

この回答への補足

つまり、push命令、pop命令、call命令、ret命令などにより、自動的に値が変化する特殊レジスタをもしエフェクティブアドレスに指定してしまったら、自動的に値が変化しなくなってしまうということですか?

補足日時:2006/01/18 17:42
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!