1

即値をセグメントレジストリに直接移動できないのはなぜですか(つまり、mov ds 10)?

また、セグメントレジスタを直接コピーできないのはなぜですか(つまり、mov es、ds)?

.code
        mov AX,@data
        mov DS,AX

なぜこれを直接行うことができないのですか?

        mov DS, @data

なぜこのように設計されたのか説明はありますか?

4

2 に答える 2

4

ここでの主な問題は、命令のエンコード/デコードです

X86 には可変長のオペコードがあります。1 バイト (nop など) から数バイト (movl $0xdeadbeef, 0x12345678(%ebx,%edx,1) などの場合は 12 バイト) まで、Intel は実際の利点を提供しない命令を含めないことを決定しました。mov segmentregister はその 1 つです。おそらく、セグメントレジスタを頻繁に変更する必要がないためです。

したがって、これにより命令エンコーディングのスペースが節約され、チップ上のいくつかのトランジスタが節約されます(今日のトランジスタダンプと比較すると、それほど多くはないかもしれません)。

命令のエンコード サイズが固定されている ARM や MIPS などの他の ISA では、通常、すべてのレジスタに対して同じ操作が可能です。ARM の場合、PC も通常のレジスタであり、読み書きも可能です。

于 2012-06-20T16:12:51.940 に答える
2

これらのレジストリはオペレーティングシステムによって設定されるため、(一部のまれな状況を除いて)編集する必要がなかったためです。では、なぜ無駄なシリコンが役に立たないことをしているのでしょうか。

ただし、これらのレジストリは別の一時的なレジストリを介して編集できます。

于 2012-06-20T11:58:27.560 に答える