Ho alcuni aspetti aggiuntivi qui:
Considera che l'operazione "a = b / c" x86 lo implementerebbe come
mov eax,b
xor edx,edx
div dword ptr c
mov a,eax
Come bonus aggiuntivo dell'istruzione div, edx conterrà il resto.
Un processore RISC richiederebbe prima il caricamento degli indirizzi di bec, il caricamento di bec dalla memoria ai registri, la divisione e il caricamento dell'indirizzo di a, quindi la memorizzazione del risultato. Dst, src sintassi:
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
Qui di solito non ci sarà un resto.
Se qualsiasi variabile deve essere caricata tramite i puntatori, entrambe le sequenze possono diventare più lunghe sebbene ciò sia una possibilità minore per il RISC perché potrebbe avere uno o più puntatori già caricati in un altro registro. x86 ha meno registri, quindi la probabilità che il puntatore si trovi in uno di essi è minore.
Pro e contro:
Le istruzioni RISC possono essere mescolate con il codice circostante per migliorare la pianificazione delle istruzioni, questa è una possibilità minore con x86 che invece fa questo lavoro (più o meno bene a seconda della sequenza) all'interno della CPU stessa. La sequenza RISC sopra sarà in genere lunga 28 byte (7 istruzioni di larghezza di 32 bit / 4 byte ciascuna) su un'architettura a 32 bit. Ciò farà sì che la memoria off-chip funzioni di più durante il recupero delle istruzioni (sette recuperi). La sequenza x86 più densa contiene meno istruzioni e anche se la loro larghezza varia, probabilmente stai osservando una media di 4 byte / istruzione anche lì. Anche se hai cache di istruzioni per accelerare questo sette recuperi significa che avrai un deficit di tre altrove da compensare rispetto a x86.
L'architettura x86 con meno registri da salvare / ripristinare significa che probabilmente eseguirà interruzioni di thread e gestirà gli interrupt più velocemente di RISC. Più registri da salvare e ripristinare richiedono più spazio temporaneo nello stack RAM per eseguire gli interrupt e più spazio nello stack permanente per memorizzare gli stati del thread. Questi aspetti dovrebbero rendere x86 un candidato migliore per eseguire RTOS puro.
Su una nota più personale trovo più difficile scrivere un assembly RISC rispetto a x86. Lo risolvo scrivendo la routine RISC in C, compilando e modificando il codice generato. Questo è più efficiente dal punto di vista della produzione del codice e probabilmente meno efficiente dal punto di vista dell'esecuzione. Tutti quei 32 registri di cui tenere traccia. Con x86 è il contrario: 6-8 registri con nomi "reali" rendono il problema più gestibile e infonde più fiducia che il codice prodotto funzionerà come previsto.
Brutta? È negli occhi di chi guarda. Preferisco "diverso".