即値をセグメントレジストリに直接移動できないのはなぜですか(つまり、mov ds 10)?
また、セグメントレジスタを直接コピーできないのはなぜですか(つまり、mov es、ds)?
.code
mov AX,@data
mov DS,AX
なぜこれを直接行うことができないのですか?
mov DS, @data
なぜこのように設計されたのか説明はありますか?
ここでの主な問題は、命令のエンコード/デコードです
X86 には可変長のオペコードがあります。1 バイト (nop など) から数バイト (movl $0xdeadbeef, 0x12345678(%ebx,%edx,1) などの場合は 12 バイト) まで、Intel は実際の利点を提供しない命令を含めないことを決定しました。mov segmentregister はその 1 つです。おそらく、セグメントレジスタを頻繁に変更する必要がないためです。
したがって、これにより命令エンコーディングのスペースが節約され、チップ上のいくつかのトランジスタが節約されます(今日のトランジスタダンプと比較すると、それほど多くはないかもしれません)。
命令のエンコード サイズが固定されている ARM や MIPS などの他の ISA では、通常、すべてのレジスタに対して同じ操作が可能です。ARM の場合、PC も通常のレジスタであり、読み書きも可能です。
これらのレジストリはオペレーティングシステムによって設定されるため、(一部のまれな状況を除いて)編集する必要がなかったためです。では、なぜ無駄なシリコンが役に立たないことをしているのでしょうか。
ただし、これらのレジストリは別の一時的なレジストリを介して編集できます。