Испытывая прессинг со стороны производителей RISC-процессоров (имеющие простую структуру, пониженное электропотребление, более высокую тактовую частоту по сравнению с процессором Pentium, но не уступающие в производительности), корпорация Intel решила в 1994 году создать свой собственный RISC-процессор, Однако ее руководство помнило, что успех ее процессорам i8088, i80386, Intel Pentium принесла в основном не ценовая или маркетинговая политика, а совместимость со старыми моделями. Именно поэтому Intel разработала не чисто RISC-процессор, у которого не было шансов закрепиться на рынке, а RISC-подобный CISC-процессор Pentium Pro.
Этот процессор обладает двухуровневым устройством управления. На первом уровне (ядре микропроцессора) реализовано обычное устройство управления RISC-процессора с его стандартными функциями (см. раздел D.2.2). На втором уровне устройство управления занимается аппаратным "переводом" CISC-инструкций процессора Pentium в RISC-инструкции ядра процессора Pentium Pro. В результате набор команд и внешнее окружение процессора Pentium Pro совпадало с Pentium, однако его было проще оптимизировать под тридцатидвухразрядные операции.
В последующих своих разработках фирма Intel стала шире использовать эту двухуровневую архитектуру, дополнив эту модель конвейером и SIMD, что обеспечивало дальнейший рост производительности. Однако, благодаря своей простоте, на основе процессоров Intel Pentium Pro можно было строить сервера с симметричной архитектурой, обладающими восемью и более процессорами, а на основе Pentium II -- только двухпроцессорные [Константин Пьянзин. "Выбираем файловый сервер"//LAN Журнал сетевых решений. -- 1998, том.4 -- 9 (сентябрь) -- стр. 105-112.](1998 год. На основе микропроцессоров Intel Pentium II Xeon и Intel Pentium III Xeon можно создавать шестипроцессорные и более мощные кластеры, но пока операционные системы для этих процессоров поддерживают до четырех таких процессоров. -- 23.07.2001.) Поэтому, по информации автора, процессоры на 01.08.1999 еще не сняты с производства (хотя объемы его производства резко сократился.) Дата прекращения выпуска этих процессоров автору не известна. Следует отметить, что для RISC-серверов созданы материнские платы с симметричной мультипроцессорной архитектурой, поддерживающих до 32-х процессоров [Там же].
Адресация памяти в микропроцессорах.
Для осуществления операций с данными в АЛУ необходимо загрузить их в микропроцессор из оперативной памяти. Но для того, чтобы выбрать данные (или, по другому, операнды) из памяти, необходимо обратиться к ним по определенному адресу. Способы задания этого адреса называется адресацией памяти в микропроцессоре.
Способы адресации
Существуют следующие способы адресации операндов:
Регистровая (операнд -- в регистре данных или адреса).
Косвенно-регистровая с постинкрементом (операнд -- в ячейке памяти, адресуемой содержимым регистра адреса, который автоматически увеличивается после выборки операнда).
Косвенно-регистровая с пердинкрементом (операнд -- в ячейке памяти, адресуемое содержимым регистра адреса, которое автоматически уменьшается перед выбором операнда).
Косвенно-регистровая с индексированием (операнд -- в ячейке памяти, ее адрес -- сумма содержимого регистра адреса, индексного регистра и задаваемого в команде 8-ми (иногда 16-ти и 32-х) разрядного смещения).
Прямая (операнд -- в ячейке памяти, адрес которой задается числом, указанным в команде).
Относительная (операнд -- в ячейке памяти, адрес которой -- сумма текущего содержимого программного счетчика и данного в команде 16-ти (32-х) разрядного смещения).
Относительная со смещением (операнд --в ячейке памяти, адрес которой -- сумма содержимого программного счетчика, индексного регистра и указанного в команде 16-ти (32-х) разрядного смещения).
Непосредственная (операнд -- в команде).
Дополнительно введены следующие способы адресации:
Косвенно-регистровая с базовым смещением и ндексированием (операнд -- в ячейке памяти, адрес которой -- сумма адресного базового регистра, индексного регистра (возможно масштабированного) и 32-х разрядного смещения).
Косвенно-регистровая с постиндексированием (к содержимому адресного (базового) регистра прибавляется смещение, затем прибавляется содержимое индексного регистра и дополнительное смещение, и все это является адресом ячейки памяти, содержащий операнд).
Косвенно-регистровая с прединдексированием (операнд -- в ячейке памяти, адрес которого определяется суммированием содержимого базового регистра, индексного регистра и базового смещения, к которому впоследствии прибавляется дополнительное смещение).
Относительное с базовым смещением и индексированием (то же, что и 10, только вместо базового регистра используется программный счетчик).
Косвенно-относительная с постиндексированием (аналогична п. 11, но вместо базового регистра используется программный счетчик).
Косвенно-относительная с прединдексированием (аналогична п. 12, но вместо базового регистра используется программный счетчик).
Как правило, другой операнд должен присутствовать в регистре адреса или данных.
Смещение может быть положительным и отрицательным. В качестве индексного регистра при индексации с индексированием может служить любой из регистров данных или адреса. Текущее содержимого программного счетчика, используемое для выделения относительного адреса, равно адресу первого слова выполняемой команды, умноженного на 2 (на 4).
Во всех способах адресации с индексированием введено масштабирование индекса. Оно осуществляется умножением содержимого индексного регистра Xn на масштабный множитель SCALE, имеющий значение 1, 2, 4 и 8. В зависимости от значения символа разрядности SIZE, указываемого после имени индексного регистра, используется 16 или 32 разряда его содержимого. Если после имени индексного регистра указан символ W (word, слово). то индексом служат 16 его младших разрядов, расширенные до 32-х разрядов битом знака. Если же указан символ L (long word, длинное слово), то индексом служит 32-х разрядное значение индексного регистра, используемое как число со знаком. При SCALE=1 содержимое Xn (индексного регистра) остается без изменения, а при SCALE = 2,4 или 8 сдвигается влево на 1, 2 или 3 разряда соответственно.
При программировании на языке ассемблера значение индекса задается следующим обозначением:
Xn.SIZE*SCALE
где Xn -- индексный регистр. Им может быть An (регистр адреса) или Dn (регистр данных). SIZE -- W или L, а SCALE -- 1, 2, 4, 8. Например: