ここにいくつかの追加の側面があります:
操作 "a = b / c"を考えると、x86はこれを次のように実装します。
mov eax,b
xor edx,edx
div dword ptr c
mov a,eax
div命令の追加ボーナスとして、edxには残りが含まれます。
RISCプロセッサでは、最初にbとcのアドレスをロードし、メモリからレジスタにbとcをロードし、除算してaのアドレスをロードしてから、結果を保存する必要があります。Dst、src構文:
mov r5,addr b
mov r5,[r5]
mov r6,addr c
mov r6,[r6]
div r7,r5,r6
mov r5,addr a
mov [r5],r7
ここでは通常、残りはありません。
ポインタを介して変数をロードする場合は、両方のシーケンスが長くなる可能性がありますが、すでに別のレジスタに1つ以上のポインタがロードされている可能性があるため、RISCの可能性は低くなります。x86はレジスターが少ないため、ポインターがそれらの1つにある可能性は小さくなります。
長所と短所:
RISC命令は、命令のスケジューリングを改善するために周囲のコードと混合される場合があります。これは、代わりにCPU自体の内部でこのシーケンスを実行する(シーケンスによっては多かれ少なかれ)x86では可能性が低くなります。上記のRISCシーケンスは、32ビットアーキテクチャでは通常28バイト長(32ビット/ 4バイト幅の7つの命令)になります。これにより、命令のフェッチ(7回のフェッチ)時にオフチップメモリがより効率的に動作します。より高密度のx86シーケンスには含まれる命令の数が少なく、その幅はさまざまですが、平均で4バイト/命令も表示されていると思います。これを高速化するための命令キャッシュがある場合でも、7回のフェッチは、x86と比較して、他の場所で3回の不足分を補うことを意味します。
保存/復元するレジスターが少ないx86アーキテクチャーは、おそらくRISCよりもスレッド切り替えを行い、割り込みをより速く処理することを意味します。保存および復元するレジスターが増えると、割り込みを行うための一時的なRAMスタックスペースと、スレッドの状態を保存するための永続的なスタックスペースが必要になります。これらの側面により、x86は純粋なRTOSを実行するためのより良い候補になるはずです。
もっと個人的には、RISCアセンブリをx86よりも書くのは難しいと思います。これを解決するには、CでRISCルーチンを記述し、生成されたコードをコンパイルして変更します。これは、コード生成の観点からはより効率的であり、実行の観点からはおそらくあまり効率的ではありません。追跡するこれらの32のレジスタすべて。x86の場合は逆になります。「実際の」名前の6〜8個のレジスタを使用すると、問題が管理しやすくなり、生成されたコードが期待どおりに機能するという信頼が高まります。
醜い?それは見る人の目にあります。「違う」を好む。