У меня есть несколько дополнительных аспектов:
Представьте, что операция "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
Здесь обычно не бывает остатка.
Если какие-либо переменные должны быть загружены через указатели, обе последовательности могут стать длиннее, хотя это менее вероятно для RISC, поскольку он может иметь один или несколько указателей, уже загруженных в другой регистр. x86 имеет меньше регистров, поэтому вероятность того, что указатель окажется в одном из них, меньше.
Плюсы и минусы:
Команды RISC могут быть смешаны с окружающим кодом для улучшения планирования команд, это менее вероятно с x86, который вместо этого выполняет эту работу (более или менее хорошо в зависимости от последовательности) внутри самого процессора. Приведенная выше последовательность RISC обычно будет иметь длину 28 байтов (7 инструкций по 32 бита / 4 байта каждая) в 32-битной архитектуре. Это заставит внешнюю память работать больше при выборке инструкций (семь выборок). Более плотная последовательность x86 содержит меньше инструкций, и, хотя их ширина варьируется, вы, вероятно, также видите в среднем 4 байта на инструкцию. Даже если у вас есть кеши инструкций для ускорения этого процесса, семь выборок означают, что вам придется восполнить дефицит трех в другом месте по сравнению с x86.
Архитектура x86 с меньшим количеством регистров для сохранения / восстановления означает, что она, вероятно, будет переключать потоки и обрабатывать прерывания быстрее, чем RISC. Для сохранения и восстановления большего количества регистров требуется больше временного пространства стека ОЗУ для прерываний и больше постоянного пространства стека для хранения состояний потоков. Эти аспекты должны сделать x86 лучшим кандидатом для запуска чистой ОСРВ.
В более личном плане мне кажется, что писать RISC-сборку труднее, чем x86. Я решаю эту проблему, написав процедуру RISC на C, скомпилировав и изменив сгенерированный код. Это более эффективно с точки зрения создания кода и, вероятно, менее эффективно с точки зрения выполнения. Все 32 регистра, которые нужно отслеживать. В x86 все наоборот: 6-8 регистров с «настоящими» именами делают проблему более управляемой и вселяют больше уверенности в том, что созданный код будет работать должным образом.
Некрасиво? Это в глазах смотрящего. Я предпочитаю «другое».