Почему там только четыре регистра в наиболее распространенном ЦП (x86)? Разве огромное увеличение скорости там не было бы то, если бы больше регистров было добавлено? Когда больше регистров будет добавлено?
Сейчас более 4-х. Если вы посмотрите на историю архитектуры x86 , вы увидите, что она произошла от набора инструкций 8086. Intel всегда хотела сохранить некоторую степень обратной совместимости в своей линейке процессоров, поэтому все последующие процессоры просто расширяли исходные регистры A, B, C, D до большего количества битов. Исходные регистры сегментов сегодня можно использовать для общих целей, поскольку сегментов больше нет (это упрощение, но примерно так). Новая архитектура x64 также предоставляет несколько дополнительных регистров.
Ну, есть и другие, четыре особые, я думаю, они «общего назначения», Причины всего этого и то, почему остальное не используется так часто, заключаются в следующем:
Существует множество архитектур с большим количеством регистров (ARM, PowerPC и т.д.). Временами они могут достигать более высокой пропускной способности инструкций, поскольку меньше работы выполняется при манипулировании стеком, и инструкции могут быть короче (нет необходимости ссылаться на переменные стека). Противоположный момент - вызовы функций становятся более дорогими из-за экономии регистров.
Используемая регистрами память действительно дорогостоящая для разработки в ЦП. Помимо трудностей конструкции, связанных с этим, увеличение количества доступных регистров делает микросхемы ЦП более дорогими.
Вдобавок:
Um..... (E/R)AX, (E/R)BX, (E/R)CX, (E/R)DX, (E/R)SI, (E/R)DI, (E/R)SP, (E/R)BP, (E/R)IP. Я считаю, что это больше, чем 4. :)
Это просто зависит от архитектурных решений.Intel Itanium имеет 128 регистров общего назначения и 128 регистров с плавающей запятой, тогда как Intel x86 имеет только 8 регистров общего назначения и стек из 8 регистров с плавающей запятой.
В x86 всегда было более четырех регистров. Изначально у него есть CS, DS, ES, SS, AX, BX, CX, DX, SI, DI, BP, SP, IP и флаги. Из них семь (AX, BX, CX, DX, SI, DI и BP) поддерживали наиболее общие операции (сложение, вычитание и т. Д.). BP и BX также поддерживали использование в качестве «базового» регистра (т. Е. Для хранения адресов для косвенное обращение). SI и DI также могут использоваться в качестве индексных регистров, которые примерно такие же, как базовые регистры, за исключением того, что инструкция может генерировать адрес из одного базового регистра и одного индексного регистра, но НЕ из двух индексных регистров или двух базовых регистров. По крайней мере, при типичном использовании SP выполняет роль указателя стека.
С тех пор регистры стали больше, было добавлено больше, а некоторые из них стали более универсальными, поэтому (например) теперь вы можете использовать любые 2 регистра общего назначения в двух регистровых режимах адресации. Как ни странно, в 386 были добавлены два сегментных регистра (FS и GS), которые также позволяли использовать 32-битные сегменты, что в большинстве случаев делало все сегментные регистры почти несущественными. Иногда они используются для локального хранилища потоков.
Я также должен добавить, что когда вы выполняете многозадачность, многопоточность и т. Д., Большое количество регистров может иметь довольно серьезное наказание - поскольку вы не знаете, какие регистры используются, когда вы выполняете контекст switch вы должны сохранить все регистры в одной задаче и загрузить все сохраненные регистры для следующей задачи. В процессорах типа Itanium или SPARC с 200+ регистрами это может быть довольно медленным.Последние SPARC выделяют изрядную часть площади чипа для оптимизации этого, но их переключение задач все еще относительно медленное. На Itanium дела обстоят еще хуже - одна из причин, по которой он менее чем впечатляет при выполнении типичных серверных задач, даже несмотря на то, что он отлично справляется с научными вычислениями с (очень) небольшим количеством переключателей задач.
Наконец, конечно, все это действительно сильно отличается от того, как работает достаточно современная реализация x86. Начиная с Pentium Pro, Intel отделила архитектурные регистры (то есть те, которые могут быть адресованы в инструкции) от реализации. Для поддержки одновременного выполнения вне очереди Pentium Pro имел (если обслуживала память) набор из 40 внутренних регистров и использовал «переименование регистров», поэтому два (или более) из них могли соответствовать заданному архитектурному регистру в данный момент времени. . Например, если вы манипулируете регистром, затем сохраняете его, загружаете другое значение и манипулируете им, процессор может обнаружить, что загрузка разрывает цепочку зависимостей между этими двумя наборами инструкций, поэтому он может выполнять обе эти манипуляции одновременно.
Pentium Pro сейчас, конечно, довольно старый - и, конечно, AMD тоже существует уже некоторое время (хотя их конструкции в этом отношении достаточно похожи). Хотя детали меняются с появлением новых процессоров, возможность переименования, которая отделяет архитектурные регистры от физических регистров, теперь более или менее стала реальностью.
Больше регистров не обязательно ускоряет работу, они усложняют архитектуру ЦП, поскольку регистры должны находиться рядом с другими компонентами, а многие инструкции работают только с определенными регистрами.
Но современные процессоры имеют более четырех регистров, на мой взгляд, это AX, BX, CX, DX, SI, DI, BP, ... тогда у процессора есть внутренние регистры, например для PIC (счетчики команд процессора )