У меня есть несколько дополнительных аспектов:
Рассмотрим операцию «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 лучшим кандидатом для запуска чистой RTOS.
Если говорить более лично, мне кажется, что писать RISC-ассемблер сложнее, чем x86. Я решаю эту проблему, написав процедуру RISC на C, скомпилировав и модифицировав сгенерированный код. Это более эффективно с точки зрения создания кода и, вероятно, менее эффективно с точки зрения выполнения. Все эти 32 регистра, которые нужно отслеживать. С x86 все наоборот: 6-8 регистров с "настоящими" именами делают проблему более управляемой и вселяют больше уверенности в том, что полученный код будет работать так, как ожидается.
Уродливый? Это в глазах смотрящего. Я предпочитаю "другое".
person
Olof Forshell
schedule
07.12.2010