Изучаем MIPS-ассемблер. Использование регистра транслирования

Предыдущие части:

Создание архитектуры RISC

Как уже неоднократно упоминалось, все х86-процессоры, решения компании Motorola и подавляющее большинство выпущенных в 1980-е годы кристаллов имели архитектуру CISC (Complex Instruction Set Computing). Совокупность всех особенностей привела к тому, что чипы стали не только сложными и дорогими в производстве, но и достигли своего потолка производительности. Для дальнейшего увеличения быстродействия требовалось наращивать количество транзисторов, однако освоенные технологические нормы не позволяли создавать более сложные решения. С этим столкнулась Intel при выпуске семейства i486. Для поднятия производительности они внесли изменения в архитектуру процессоров, добавив кэш-память, множители и конвейеры. Словом, 486-е «камни» получили некоторые «фишки» архитектуры RISC. Тем не менее к созданию RISC-платформы американская компания никакого отношения не имеет. Своим созданием архитектура обязана американскому инженеру Дэвиду Паттерсону, который руководил проектом Berkeley RISC с 1980 по 1984 годы.

Дэвид Паттерсон - отец RISC

Первоначальной идеей, которая затем воплотилась в столь масштабный проект Berkeley RISC, стало исследование работы Motorola 68000. В ходе наблюдений выяснилось, что программы попросту не использовали подавляющее большинство инструкций, заложенных в процессор. Например, система Unix при компиляции использовала лишь 30% команд. Поэтому в рамках проекта Berkeley RISC планировалось создать такой процессор, который бы содержал лишь самые необходимые инструкции.

После нескольких лет исследований и разработки было выпущено несколько образцов процессоров, название которых и дало имя всей архитектуры. Сама аббревиатура RISC расшифровывается как Restricted (Reduced) Instruction Set Computer, что переводится как «компьютер с сокращенным набором команд». «Сокращенный набор команд» вовсе не означает, что количество инструкций меньше, чем число команд CISC-кристаллов. Разница состоит в том, что любая инструкция платформы RISC является простой и выполняется за один такт (по крайней мере, должна выполняться), тогда как на выполнение RISC-инструкции могло уходить несколько десятков тактов. При этом длина команды является фиксированной. Например, 32 бита. Также у RISC имеется гораздо больше регистров общего назначения. Плюс для этой архитектуры характерна конвейеризация. Именно ее использование (вкупе с упрощенными командами) позволяет эффективно наращивать тактовую частоту процессоров RISC.

Команда проекта Berkeley RISC

Дебютными решениями стали RISC I и RISC II - детища Паттерсона и проекта Berkeley RISC. Первый содержал более чем 44 000 транзисторов и работал на частоте 4 МГц. Такой процессор при выполнении небольших программ был в среднем в два раза быстрее VAX 11/780 и примерно в четыре раза производительнее, чем «камень» Zilog Z8000. RISC II отличался от предшественника большим количеством инструкций: 39 против 32. Он был более быстрым. Его преимущество над процессором VAX достигало 200%, а Motorola 68000 в некоторых программах был медленнее примерно в четыре раза.

Нужно отметить, что Berkeley RISC был частью большого проекта под названием VLSI. Сюда также входил проект Стэнфордского университета MIPS, который стартовал в 1981 году.

Процессоры MIPS

Главой проекта MIPS был ученый Стэнфордского университета Джон Хэннесси. Как и в случае с Berkeley RISC, задачей стартапа было исследование и создание такого процессора, который использовал бы конвейер и сокращенный набор команд. Архитектура MIPS-решений также предусматривала наличие вспомогательных блоков в составе кристалла: например, модулей для работы с памятью, целочисленного АЛУ (арифметико-логическое устройство) и декодеров команд. Отличием плана MIPS от Berkeley RISC было использование удлиненного конвейера. Архитектура RISC, в принципе, предполагает использование конвейера, но Хэннесси пошел дальше и предложил максимально удлинить конвейер в процессоре, то бишь еще больше «раздробить» выполнение одной операции. Такой подход открывал еще большие просторы по наращиванию тактовой частоты. При этом удлинение конвейера обеспечивало более эффективное распараллеливание выполнения команд. В то время распараллеливание являлось отличительной чертой RISC-архитектуры, поскольку ни в одном CISC-процессоре эта функция не была реализована вплоть до появления в них конвейеров. Например, в MIPS, так же как и в RISC, выполнение одной команды могло быть еще не завершено, когда начиналась выполняться другая. В процессорах CISC для старта выполнения одной инструкции было необходимо, чтобы была окончена обработка другой.

Джон Хэннесси - создатель архитектуры MIPS, а ныне президент Стэнфордского университета

В первоначальной спецификации процессоров MIPS не была предусмотрена поддержка таких элементарных операций, как умножение и деление. Сделано это было специально. Таким образом, разработчики хотели избавиться от необходимости использования так называемых блокировок конвейера. Сама блокировка представляла собой приостановку конвейера в тех случаях, когда операцию на определенной стадии конвейера невозможно выполнить за один такт. Тем не менее первые реализации архитектуры MIPS работали с блокировками и даже поддерживали операции умножения и деления. Прошло некоторое время, прежде чем в процессорах была реализована первоначальная задумка.

В 1984 году Хэннесси покинул Стэнфордский университет и основал компанию MIPS Computer Systems, которая и занялась выпуском процессоров с одноименной архитектурой. Спустя год увидел свет первый продукт компании - 32-битный «камень» R2000. Он стал первой коммерчески доступной RISC-моделью в истории. В 1988 году появился процессор следующего поколения под названием R3000. В сравнении с R2000 он получил поддержку многопроцессорности и кэш-памяти инструкций и данных. «Трехтысячный» оказался коммерчески успешным. Процессор использовался в серверных системах и рабочих станциях таких компаний, как Silicon Graphics, DEC, Seiko Epson и многих других. Плюс R3000 стал сердцем игровой консоли Sony PlayStation.

Процессор MIPS R3000

На разработку следующего поколения MIPS-процессоров ушло три года. Процессор R4000 был представлен в 1991 году. Он получил 64-битную архитектуру, встроенный сопроцессор и работал на более высокой тактовой частоте, нежели предшественники. Так, минимальная частота R4000 составляла 100 МГц. Объем кэш-памяти инструкций и данных составлял 8 Кбайт каждый. Спустя два года была представлена доработанная версия процессора с индексом R4400. Новый кристалл обладал увеличенным вдвое кэшем и поддерживал кэш-память второго уровня большего объема. Помимо этого, были исправлены многочисленные ошибки при работе в 64-разрядном режиме.

Удивительно, что, несмотря на коммерческий успех своих процессоров, MIPS испытывала финансовые трудности и в конечном счете была куплена компанией SGI и переименована в MIPS Technologies. Следом начались выдаваться лицензии на производство клонов сторонним компаниям. Так, компания QED (Quantum Effects Devices) создала недорогие MIPS-процессоры, которые использовались в маршрутизаторах Cisco. А NEC занималась производством «камня» VR4300, который «прописался» в игровой консоли Nintendo 64.

Процессор NEC VR4300 использовался в приставке Nintendo 64

В 1994 году появился процессор R8000. Он стал первым MIPS-решением с суперскалярной архитектурой, которая подразумевает параллельное выполнение команд при условии, что исполнение одной команды не зависит от результата другой. Например, R8000 умел обрабатывать до четырех инструкций за такт.

В январе 1996 года MIPS представила процессор следующего поколения под названием R10000. «Десятитысячный» использовал такую же суперскалярную архитектуру, как и R8000, и, по сути, являлся доработанной версией предшественника. Также процессор имел кэш-память инструкций и данных объемом 32 Кбайт каждая и работал на частоте 175 МГц или 195 МГц. В 1997 году даже появилась версия чипа с частотой 250 МГц. Но даже при параметре 195 МГц R10000 был одним из быстрейших процессоров того времени.

Процессор R10000, произведенный компанией Toshiba

К сожалению, после запуска R10000 компания SGI забросила MIPS-архитектуру. Все последующие кристаллы основывались на ядре «десятитысячного» и не имели в сравнении с ним каких-то принципиальных отличий. Например, процессор R12000, представленный в 1998 году, получил дополнительную стадию в конвейер и улучшенную работу с очередями инструкций. Его тактовая частота составляла 270 МГц, 300 МГц или 360 МГц. После R12000 вышли еще два поколения процессоров MIPS: R14000 и R16000. Они получили поддержку более быстрых системных шин, увеличенные частоты и кэш-память большего объема. Например, R16000 мог работать на частоте 700 МГц и поддерживал 64 Кбайт кэш-памяти инструкций и данных.

После этого MIPS занялась продажей лицензий на 32-битную и 64-битную архитектуры MIPS32 и MIPS64.

Процессоры SPARC

Компания Sun Microsystems также решилась на разработку архитектуры - SPARC (Scalable Processor ARChitecture). Так, инженеры черпали вдохновение из проекта Berkeley RISC. А сам Дэвид Паттерсон даже привлекался к проекту в качестве консультанта. Тем не менее в результате SPARC больше напоминала MIPS-архитектуру. Например, в наборе команд платформы также отсутствовали инструкции умножения и деления. Особенностью архитектуры SPARC стало использование регистрового окна, с помощью которого был немного изменен процесс вызова функций в программах. Обычно при вызове программ процессор запоминал свое состояние (то есть запоминал состояние некоторых регистров общего и специального назначения), переходил к выполнению функции, а затем возвращался в свое исходное состояние до вызова функции. А в процессорах SPARC при вызове функции необходимые данные записывались в конец регистрового окна, а само регистровое окно перемещалось по файлу так, чтобы данные оказывались в начале окна. Такой подход в теории обеспечивал более высокую скорость работы.

Процессор SPARC V7, изготовленный компанией Fujitsu

Первая версия архитектуры получила название SPARC V7. Одноименный процессор на ее базе производился вплоть до 1992 года. Затем появилась следующая генерация архитектуры - SPARC V8. Она не претерпела каких-либо кардинальных изменений. Ключевыми отличиями стало добавление операций умножения и деления, а также улучшенное выполнение арифметики чисел с плавающей запятой. Как и SPARC V7, SPARC V8 оставалась 32-битной архитектурой, на базе которой был создан процессор microSPARC. Он принадлежал к Low-End-сегменту и использовался в небольших рабочих станциях и встраиваемых системах. Силами компаний Texas Instruments и Fujitsu также были выпущены улучшенные клоны. Более производительным решением стал процессор SuperSPARC.

Созданием следующего поколения архитектуры с именем SPARC V9 работала уже целая организация SPARC Architecture Committee, в состав которой, кроме самой Sun, входили такие компании, как Texas Instruments, Fujitsu, Philips и многие другие. Платформа была расширена до 64 бит и являлась суперскалярной с 9-стадийным конвейером. SPARC V9 предусматривала использование кэш-памяти первого уровня, разделенного на инструкции и данные объемом 16 Кбайт каждая, а также второго уровня емкостью 512-4096 Кбайт. Реализацией архитектуры стал процессор UltraSPARC с частотой 143-200 МГц.

Процессор UltraSPARC II

UltraSPARC не был единственным процессором с архитектурой SPARC V9. В 1997 году был представлен UltraSPARC II.

Процессоры ARM

История ныне популярных ARM-процессоров, а точнее самой архитектуры ARM, начинается с компании Acorn Computers и ее компьютера BBC Micro. В нем использовался «камень» MOS Technology 6502, однако его производительности было недостаточно, чтобы создать десктоп следующего поколения. По различным причинам другие доступные процессоры также не подходили под требования Acorn, поэтому в компании задумались о создании собственного чипа. После изучения различных архитектур, инженеры Acorn взяли за основу процессоры RISC и все тот же кристалл MOS Technology 6502.

Компьютер BBC Micro

У процессора MOS, например, была позаимствована архитектура доступа к памяти и набор инструкций. Каждая инструкция была дополнена специальным четырехбитным кодом условия. В зависимости от значения кода (true или false) инструкция могла выполняться или не выполняться. Это позволило сократить количество переходов при выполнение операций, которые негативно влияли на производительность конвейерной архитектуры. Также разработчики заложили в первоначальную ревизию архитектуры команды, которые выполняли несколько элементарных операций. Словом, немного отступили от правил RISC. Однако в конечном счете это лишь улучшило производительность процессора.

Разработка архитектуры была завершена в 1985 году созданием процессора ARM. Первые же коммерческие варианты появились в 1986 году и носили название ARM2. По сравнению с CISC-процессорами, ARM2 был очень простым - он содержал всего 30 000 транзисторов. При этом он потреблял очень мало энергии и в то же время был достаточно производительным. Несколько позже появились и ARM-процессоры, в которые были добавлены 4 Кбайт кэш-памяти, что еще больше повысило производительность кристаллов.

Процессор ARM2

К концу 1980-х годов Acorn занималась разработкой архитектуры ARM уже не в одиночку – к ней присоединилась Apple. В связи с этим подразделение, занимавшееся непосредственно ARM-процессорами, было преобразовано в отдельную компанию – Advanced RISC Machines. Первым продуктом новой компании стало процессорное ядро ARM6 и процессор ARM610, который использовался в одном из первых в мире КПК Apple Newton.

Однако ARM-процессоры уже не могли соперничать с CISC-решениями в плане производительности, а в RISC-сегменте господствовали процессоры с архитектурой MIPS. Тогда в ARM пошли иным путем. Компания начала позиционировать ARM6 как встраиваемое ядро, которое любой сторонний производитель мог использовать в своих процессорах за небольшие деньги. Такая политика принесла свои плоды, и ядро ARM стало очень популярным, а сама компания - коммерчески успешной.

Вместе с компанией DEC была разработана архитектура для более производительных ARM-решений под названием StrongARM, которое представляло собой классическую скалярную архитектуру с 5-стадийным конвейером. Архитектура имела блоки управления памятью и поддерживала кэш-память инструкций и данных объемом 16 Кбайт каждая.

Первый процессор на базе StrongARM - SA-110 - был представлен в феврале 1996 года. Он работал на тактовых частотах 100 МГц, 160 МГц или 200 МГц. «Камень» использовался в Apple MessagePad 2000, а также системах Acorn Computer Risc PC и Eidos Optima. На протяжении 1996 года SA-110 оставался самым производительным мобильным процессором.

Apple MessagePad 2000 использовал процессор SA-110

В 1997 году права на архитектуру StrongARM были проданы компании Intel, которая занялась разработкой следующего поколения платформы. В 2000 году оно было представлено, но архитектура (а точнее реализация архитектуры) носила другое название - Xscale. Платформа получила множество изменений. Например, длина конвейера была увеличена до 8 стадий. Объем кэш-памяти как для инструкций, так и для данных увеличился до 32 Кбайт. XScale использовался в таких устройствах, как RIM Blackberry, Dell Axim, мобильном телефоне Motorola A780 и других девайсах.

Процессоры PowerPC

Если быть уж совсем точным, то первой компанией, начавшей разработку RISC-архитектуры, стала IBM. Еще в 1974 году стартовала разработка процессора IBM 801, которая и заложила первые основы для этой платформы. А проект Berkeley RISC окончательно сформировал архитектуру.

В начале 80-х годов некоторые процессоры IBM для встраиваемых систем использовали архитектуру 801. Процессор на его базе также «прописался» в компьютере IBM 9370.

В 1985 году IBM начала разработку RISC-архитектуры следующего поколения. Проект получил название America Project. Разработка процессора и набора инструкций для него закончилась в 1990 году. Сам кристалл получил название POWER1 и использовался в серверах и рабочих станциях IBM. Он обладал достаточно высоким уровнем производительности, но имел многочиповую компоновку и состоял из 11 различных микросхем. В 1992 году IBM представила бюджетный вариант процессора POWER1, который умещался в одном чипе.

Процессор POWER1. Даже, скорее, чипсет

В 1993 году была представлена второе поколение архитектуры POWER2. В него было добавлено по одному дополнительному блоку арифметико-логических операций и вычислений с плавающей запятой. Также был расширен набор команд: например, была добавлена операция вычисления квадратного корня из числа на аппаратном уровне. Тактовая частота процессора варьировалась от 55 МГц до 71 МГц, а кэш-память данных и инструкций - 256 Кбайт и 32 Кбайт соответственно. Как и предшественник, новый процессор имел многочиповую компоновку. Но в мае 1994 года была выпущена и одночиповая версия.

Однако еще до выхода POWER2 IBM вместе с Apple и Motorola образовали альянс AIM и договорились о создании улучшенной архитектуры на основе POWER. В выигрыше остались все три компании, получив один из самых быстрых RISC-процессоров на рынке. Разработанная совместно архитектура получила название PowerPC. Помимо базового набора функций платформы POWER, в нее были добавлены поддержка работы в двух режимах (big-endian и little-endian), новые инструкции для вычислений с плавающей запятой и обратная совместимость с 32-битным режимом работы для 64-разрядной версии архитектуры.

Процессор PowerPC первого поколения

В отличие от других RISC-архитектур, которые занимали узкие ниши рынка, PowerPC позиционировалась как платформа-конкурент x86. Ее основным назначением являлись персональные компьютеры. Так, процессор на базе PowerPC довольно долгое время использовался в компьютерах Apple Macintosh - вплоть до 2006 года.

Архитектура конкурировала наравне с x86 до 2001 года, но после этого угнаться за процессорами Intel и AMD не смогла. Несмотря на это, процессоры на базе PowerPC использовались в игровых консолях Sony PlayStation 3 и Microsoft Xbox 360.

Консоли Sony PlayStation 3 и Microsoft Xbox 360 работают под управлением процессора PowerPC

В 90-е годы IBM успела выпустить третью генерацию процессоров под названием POWER3, которая, по сути, стала реализацией 64-разрядной архитектуры PowerPC. Чип создавался с прицелом на использование в серверах и рабочих станциях, но в итоге его главным применением стали системы IBM RS/6000.

Процессоры DEC Alpha

Архитектура DEC VAX безнадежно устаревала и в начале 90-х в компании задумались о разработке собственной RISC-платформы. Ей стала Alpha, выпущенная в 1994 году. Первым процессором стал Alpha 21064 с кодовым названием EV4. Это 64-разрядный суперскалярный кристалл с конвейерной архитектурой. То есть имел классический RISC-дизайн. Процессор DEC выгодно отличала отлаженная работа всех его блоков. Так, при равной с другими «камнями» частоте EV4 показывал более высокую производительность. Внешняя шина процессора была 128-разрядной. Он имел 16 Кбайт кэш-памяти данных и инструкций и изготавливался с помощью технологии CMOS-4. Тактовая частота EV4 составляла 150 МГц или 200 МГц. Несколько позже появилась модификация под названием 21064A, которая могла работать на скоростях вплоть до 300 МГц, что обеспечило кристаллу звание самого быстрого процессора того времени. Основным применением EV4 стали серверы и рабочие станции.

Процессор Alpha 21064

Alpha 21064A оставался топовой моделью DEC до выхода следующего поколения процессоров - 21164 (EV5). Он обладал двумя целочисленными блоками и двумя модулями вычислений с плавающей запятой. В EV5 было уже три уровня кэш-памяти: два располагались непосредственно в процессоре, а третий был внешним. Кэш-память первого уровня была разделена на две части: кэш данных и кэш инструкций объемом 8 Кбайт каждый. Объем кэш-памяти второго уровня составлял 96 Кбайт. Тактовая частота процессора варьировалась от 266 МГц до 333 МГц. Alpha 21164 перенял пальму первенства у Alpha 21064A и был быстрейшим процессором до выхода Pentium Pro. Тем не менее, ответ DEC не заставил себя долго ждать - компания выпустила более производительный процессор Alpha 21164A, работающий на более высоких тактовых частотах (до 666 МГц). Процессор использовался в рабочих станциях и серверных компьютерах таких компаний, как Digital, Network Appliance и Cray Research.

Процессор Alpha 21264

В 1996 году было представлено следующее поколение процессоров DEC - Alpha 21264 (EV6). Чип получил несколько важных изменений по сравнению с предшествующими моделями. Например, он поддерживал внеочередное исполнение инструкций, что повлекло за собой полную реорганизацию ядра. Целочисленные блоки и блоки загрузки/сохранения были объединены в единый модуль Ebox, а блоки вычислений с плавающей запятой выделены в модуль Fbox. Помимо самих блоков, эти юниты содержали еще и файлы регистров. Структура кэш-памяти опять стала двухуровневой - она пришла на смену трехуровневой организации кэша в Alpha 21164. Кэш первого уровня сохранил разделение на память для инструкций и для данных. Объем каждой части составлял 64 Кбайт. Что касается кэш-памяти второго уровня, то ее объем мог составлять от 1 Мбайт до 16 Мбайт. Плюс процессор получил поддержку предсказания ветвлений. С течением времени выпускались все новые и новые версии процессоров Alpha 21264, в которых, прежде всего, наращивалась тактовая частота. Последней модификацией стал Alpha 21264E, который работал на частоте 1250 МГц.

Увы, но линейка процессоров Alpha 21264 стала последней в истории «независимой» DEC. В начале 1998 года DEC признали банкротом, и она была поглощена компанией Compaq.

Архитектура Intel P5

Процессоры с архитектурой RISC в своем большинстве заняли свою специализированную нишу, однако в настольных системах все равно продолжали использоваться кристаллы с архитектурой x86. Их развитие продолжалось, пусть и с некоторыми изменениями.

Несмотря на то, что Intel вышла на рынок RISC-процессоров со своими решениями i860 и i960, основную ставку в компании все же делали на x86-кристаллы. Следующим поколением «камней» стали всем известные Pentium на базе архитектуры P5, выпущенные в 1993 году.

Была проделана большая работа. Во-первых, P5 стала суперскалярной. Архитектура работала с помощью двух конвейеров, каждый из которых мог выполнять две операции за такт. Во-вторых, шина данных стала 64-битной, что позволило передавать вдвое больший объем данных за цикл. В-третьих, кэш-память данных и инструкций была разделена на два отдельных блока объемом 8 Кбайт каждый. Помимо этого, в процессор был добавлен блок предсказания ветвлений, а модуль вычислений с плавающей запятой стал более производительным.

Первые процессоры линейки Pentium работали на частотах 60 МГц или 66 МГц. При этом для их работы требовалось напряжение 5 В, поэтому они сильно грелись. Также первые «пни» прославились неправильной работой блока вычислений с плавающей запятой, который в некоторых случаях при выполнении деления чисел выдавал неверный результат. Поэтому вскоре Intel запустила в продажу процессоры с исправленной архитектурой P54C.

Процессор Intel Pentium

P54C стала своего рода работой над ошибками. Производство новых процессоров было переведено на 0,6-мкм техпроцесс. Сами кристаллы теперь работали с напряжением 3,3 В, что позволило решить проблему с перегревом. Что касается изменений на уровне архитектуры, то в P54C был добавлен полуторный множитель - отныне процессоры работали на более высокой частоте, чем системная шина. Скорость работы процессоров составляла 75 МГц, 90 МГц или 100 МГц. Также P54C устанавливались в разъемы Socket 5 или Socket 7. В отличие от P5, которые поддерживали только Socket 4. Сама архитектура P54C еще раз получила обновление в 1995 году, когда была переведена на 350-нм техпроцесс. Это позволило вновь снизить энергопотребление кристаллов, а также увеличить их тактовую частоту до 200 МГц.

Материал из Википедии - свободной энциклопедии

MIPS
Разработчик
Разрядность
Представлена
Архитектура
Тип

Регистр-регистр

Кодирование СК

фиксированное

Переходы

по сравнению двух регистров

Порядок байтов

Bi-endian (big→bi)

Расширения

MDMX, MIPS-3D, MIPS16e, MIPS MT

Регистры
Общего назначения
Вещественные

32 (для double используются пары регистров в 32-битных версиях процессора)

В настоящее время различные реализации MIPS используются в основном во встроенных системах, например, в смартфонах , маршрутизаторах , шлюзах , а также в игровых консолях, таких, как Sony PlayStation 2 и Sony PlayStation Portable. До конца 2006 года они применялись и в компьютерах SGI . К концу 1980-х и 1990-х эта архитектура широко использовалась многими компаниями, среди них Digital Equipment Corporation , NEC , Pyramid Technology, Siemens Nixdorf и Tandem Computers . С середины до конца 1990-х годов каждым третьим микропроцессором на рынке был процессор под управлением MIPS.

История

Основоположник RISC

В 1981 году коллектив под руководством Джона Хеннесси (John L. Hennessy) из Университета Стэнфорда начал работу над проектом, который получил название MIPS. Главной идеей было увеличить производительность процессора, используя удлиненный конвейер . Концепция применения конвейера в качестве основной технологии была известна ещё задолго до этого (например, в IBM 801), но она не использовала весь свой потенциал. Центральный процессор включает в себя несколько специальных субблоков, таких, как декодеры команд, целочисленное АЛУ (арифметико-логическое устройство), блоки загрузки/хранения (работа с памятью) и т. д. В традиционной не оптимизированной реализации отдельная команда в программе должна быть (почти всегда) завершена, прежде, чем запустится другая; в то время как в конвейерной архитектуре последовательные команды могут выполняться параллельно. Например, когда математическая инструкция вносится в блок с плавающей запятой, блок загрузки/хранения памяти может в этот же момент вызвать следующую команду.

Одним из главных препятствий в использовании конвейера был тот факт, что некоторые команды, такие, как деление, выполняются намного дольше, и, вследствие этого, центральному процессору приходится ждать, прежде, чем передать на конвейер следующую команду. Единственное решение этой проблемы - использовать серию блокировок, позволяющих определенным стадиям конвейера индицировать, что они заняты и, в этом случае, приостанавливать вышестоящие в потоке команды. Группа Хеннеси рассматривала эти блокировки как огромный барьер в увеличении производительности, поскольку было необходимо обращаться ко всем модулям Центрального процессора, что занимает лишнее время и ограничивает тактовую частоту. Главным аспектом устройства MIPS было согласовать каждую подфазу каждой команды, в том числе кэширование, в один цикл, таким образом избегая необходимости в блокировках и пропуская на конвейер только один цикл.

Хотя такая реализация и исключала бы некоторые очень полезные операции, такие, как умножение и деление, очевидно, что предельная производительность системы значительно увеличилась бы, так как микросхемы смогли бы работать с более высокой тактовой частотой. Достижение высокой скорости с использованием блокировок было бы затруднительным, так как время, требуемое для установки блокировок, пропорционально тактовой частоте, в свою очередь, зависящей от размера кристалла. Вот почему исключение вышеупомянутых операций стало спорным вопросом.

Другое отличие архитектуры MIPS от конкурирующих с ним Berkeley-архитектур - внедренная в Berkeley-RISC возможность обработки вызова подпрограмм. Чтобы увеличить производительность столь общей задачи, в Berkeley-RISC была использована технология, называемая регистровым окном , которая, тем не менее, ограничивала максимальную глубину многоуровневых вызовов. Каждый вызов подпрограммы требовал свой набор регистров, что делало необходимым увеличение их количества. Тогда как аппаратная реализация данного механизма занимала дополнительное пространство в кристалле ЦП. Но Хеннесси полагал, что более «тщательный» компилятор мог бы найти свободные регистры для передачи параметров функции, и что всего лишь увеличение числа регистров могло бы не только упростить эту задачу, но и увеличить производительность всех операций. Поэтому было принято решение отказаться от данной технологии в MIPS.

Архитектура MIPS была, в некотором отношении, наиболее типичной для RISC . Чтобы сэкономить биты в коде команды, в RISC было уменьшено количество инструкций для кодирования. В MIPS из 32 битов слова всего 6 используются для основного кода, а остальные могут содержать либо единственный 26-битный адрес перехода, либо до 5 полей, устанавливающих от 1 до 3 регистров + длина сдвига регистра. Существует и ряд других форматов, например, когда 2 регистра задаются непосредственно выделенным 16-битным полем и т. д. Такое распределение позволило процессору загружать команду и необходимые ей данные за один машинный такт, в то время как в более старых архитектурах (не являвшихся RISC), например, таких, как MOS Technology 6502, требовались отдельные такты для загрузки основного кода и данных.

Это было одним из главных усовершенствований, наращивающих производительность, предлагаемых RISC. Однако следует заметить, что неRISC-архитектуры все же достигли подобной скорости, но другими средствами (такими, как очереди в ЦП).

Первая аппаратная реализация

В 1984 году, убежденный в коммерческом спросе на свою разработку, Хеннесси покинул Стэнфорд и основал компанию MIPS Computer Systems. В 1985 году вышла первая коммерческая реализация микропроцессора MIPS - R2000 , доработанная в 1988 году и получившая название R3000 . Эти 32-битные процессоры легли в основу продуктовой линейки компании в 1980-х и использовались преимущественно в SG-сериях рабочих станций. Новые коммерческие проекты не соответствовали Стэнфордским научным исследованиям, так как практически все блокировки выполнялись на аппаратном уровне, к тому же операции умножения и деления были полностью реализованы.

В 1991 году впервые был представлен как 64-битный микропроцессор MIPS - модель R4000. R4000 имеет расширенный TLB , в котором запись содержит не только виртуальный адрес, но и виртуальный идентификатор адресного пространства. Такой буфер устраняет основные проблемы производительности микроядра, достаточно медлительного в конкурирующих архитектурах (Pentium , PowerPC , Alpha) из-за необходимости сбрасывать TLB во время частого переключения контекста.

Тем не менее, у MIPS возникали финансовые трудности в связи с поставкой процессоров на рынок. Проект был настолько важен для SGI (в то время являвшихся одними из немногих основных покупателей MIPS), что в 1992 году SGI выкупили права на компанию с условием гарантии, что конструкция микропроцессоров не изменится. Став дочерней компанией, MIPS Computer Systems получили название MIPS Technologies .

Лицензируемая архитектура

В начале 1990 года MIPS начали лицензирование своих разработок для сторонних производителей. Идее сопутствовала удача из-за простоты ядра, которое находило множество применений, где ранее использовались намного менее эффективные CISC -архитектуры, с тем же количеством и той же ценой схем (2 этих критерия тесно связаны: цена ЦП, как правило, зависит от количества схем и контактов). Компания Sun Microsystems сделала аналогичную попытку лицензировать SPARC -ядра, но Sun подобная удача не сопутствовала. К концу 1990-х MIPS стали наиболее важной компанией в производстве встроенных процессоров, и в 1997 году 48-миллионные поставки процессоров на MIPS-ядрах заставили RISC-архитектурам вытеснить популярное семейство процессоров 68k. MIPS были настолько популярны, что в 1998 году SGI передали часть активов MIPS Technologies . На сегодняшний день половина доходов MIPS дает лицензирование разработок, а большая часть другой половины - с контрактов на разработку ядер для производства сторонними производителями.

В 1999 году MIPS формализовали свои системы лицензирования вокруг двух основных конструкций - 32-разрядной MIPS32 (на базе MIPS II с некоторыми дополнительными функциями MIPS III, IV MIPS и MIPS V) и 64-разрядных MIPS64 (на базе MIPS V). Лицензия на MIPS64 была приобретена каждой из компаний NEC , Toshiba и SiByte (впоследствии приобретенная Broadcom) сразу же после объявления о её выпуске. Вскоре к ним присоединились Philips , LSI Logic и IDT. Успех следовал за успехом, и сегодня процессоры MIPS являются одним из наиболее востребованных товаров на рынке устройств компьютерного типа (карманных компьютеров, приставок и т. п.), наряду с другими разработчиками, тщетно пытающимися их вытеснить.

Через несколько лет после того, как MIPS-архитектура стала лицензируемой, она начала привлекать все больше и больше новых компаний по разработке процессоров. Первой такой компанией была Quantum Effect Devices (см. следующий раздел). Команда разработчиков, собравших MIPS R4300i , основала компанию SandCraft, предоставившую компании NEC новый процессор R5432 , а немного позднее смоделировавшую R71000 - один из первых нестандартных процессоров для рынка встраиваемых систем. Команда основателей компании DEC StrongARM, в конце концов, разделилась на две новых компании по разработке процессоров, в основу которых лег MIPS: SiByte, производившая SB-1250 - одну из первых чиповых систем с высокой производительностью, основанных на MIPS (SOC) и Alchemy Semiconductor (позднее приобретенная AMD), производившая Au-1000 SOC для маломощных приложений. Компания Lexra использовала архитектуру, подобную MIPS, добавив к ней DSP для рынка аудиомикросхем, а также поддержку многопотокового режима для сетевого рынка. Так как Lexra не покупала лицензию на MIPS, вскоре между двумя компаниями разгорелись судебные процессы. Первый был довольно быстро погашен уже после того, как Lexra пообещала не продвигать свои процессоры, как сходные с MIPS. Второй процесс (о патенте MIPS 4814976 на обработку невыровненной инструкции (unaligned) доступа к памяти) был более затяжным и негативно отразился на бизнесе обеих компаний, а по его завершении MIPS Technologies выдали Lexra бесплатную лицензию и выплатили денежную компенсацию в крупном размере.

Следом за этими событиями на рынке появились две компании, специализирующиеся на создании многоядерных устройств, использующих архитектуру MIPS. Корпорация Raza Microelectronics выкупили производственную линию у менее успешных SandCraft, а затем начала выпускать восьмиядерные устройства для рынка телекоммуникаций и сетей. Cavium Networks, изначально являвшиеся поставщиком средств защиты процессоров, тоже начали производство восьми, а позже и 32-ядерных архитектур для тех же рынков. Обе компании сами проектировали ядра, и лишь лицензировали разработки, вместо того, чтобы покупать готовые проекты процессоров MIPS.

Потеря рынка ПК

Среди производителей, создавших рабочие станции с использованием микропроцессоров MIPS, - такие компании, как SGI , MIPS Computer Systems, Inc., Whitechapel Workstations, Olivetti, Siemens-Nixdorf, Acer, Digital Equipment Corporation, NEC, и DeskStation. В числе операционных систем, портированных на архитектуру MIPS: IRIX компании SGI, Windows NT (до версии 4.0) компании Microsoft , Windows CE , Linux , UNIX (System V и BSD), SINIX, QNX , и операционная система RISC OS, непосредственно принадлежащая компании MIPS Computer Systems.

В начале 1990-х существовало предположение, что MIPS вместе с другими мощными процессорами RISC вскоре обгонят архитектуру IA32 компании Intel . Этому способствовала поддержка двух первых версий Windows NT для Alpha , MIPS и PowerPC компании Microsoft , и, в несколько меньшей степени, - архитектуры Clipper и SPARC. Однако, как только Intel выпустил новейшие версии ЦП семейства Pentium , Microsoft Windows NT v4.0 перестал поддерживать все, кроме Alpha и Intel. После решения SGI перейти на архитектуры Itanium и IA32 процессоры MIPS практически полностью перестали использоваться в персональных компьютерах.

Рынок встраиваемых систем

В 1990-е годы MIPS -архитектура была широко распространена на рынке встраиваемых систем : для сетей, телекоммуникаций, видеоигр, игровых консолей, принтеров, цифровых приставок, цифровых телевизоров, xDSL и кабельных модемов, а также карманных компьютеров.

Низкое энергопотребление и температурные характеристики встраиваемых MIPS-архитектур, широкие возможности внутренних функций делают этот микропроцессор универсальным для многих устройств.

Синтезируемые ядра для рынка встраиваемых систем

В последние годы большинство технологий, используемых в различных поколениях MIPS , предложены в виде IP-ядер (стандартных блоков) для встраиваемых реализаций процессора. Более того, предложены оба типа ядер - основанные на 32 и 64 битах, известные как 4K и 6K . Такие ядра могут совмещаться с другими структурными элементами, такими, как FPU , системами SIMD , различными устройствами ввода-вывода и т. д.

Некогда коммерчески успешные ядра MIPS, и в настоящее время нашли потребительское и промышленное применение. Эти ядра можно найти в новых маршрутизаторах Cisco , Linksys , ZyXEL и MikroTik , кабельных и ADSL -модемах, смарт-картах , механизмах лазерных принтеров, цифровых приставках, роботах, карманных компьютерах, Sony PlayStation 2 и Sony PlayStation Portable. Тем не менее, в приложениях мобильных телефонов и PDA MIPS не удалось сместить прочно установившуюся там конкурирующую ARM -архитектуру.

Процессоры под управлением MIPS включают в себя: IDT RC32438; ATI Xilleon; Alchemy Au1000, 1100, 1200 ; Broadcom Sentry5; RMI XLR7xx, Cavium Octeon CN30xx, CN31xx, CN36xx, CN38xx and CN5xxx; Infineon Technologies EasyPort, Amazon, Danube, ADM5120, WildPass, INCA-IP, INCA-IP2; Microchip Technology PIC32 ; NEC EMMA and EMMA2, NEC VR4181A, VR4121, VR4122, VR4181A, VR5432, VR5500; Oak Technologies Generation; PMC-Sierra RM11200; QuickLogic QuickMIPS ESP; Toshiba Donau, Toshiba TMPR492x, TX4925, TX9956, TX7901.

Суперкомпьютеры MIPS

Одним из наиболее интересных применений архитектуры MIPS является их использование в многопроцессорных вычислительных суперкомпьютерах. В начале 1990-х компания Silicon Graphics (SGI) перенаправила свой бизнес с графических терминалов на рынок высокопроизводительного вычисления. Успех первых попыток компании в области серверных систем (а именно, серия Challenge, основанная на R4400, R8000 и R10000) мотивировал SGI создать гораздо более мощную систему. Использование R10000 позволило компании спроектировать систему Origin 2000, в конечном счете расширяемую до 1024 ЦП, используя собственную межсистемную связь cc-NUMA (NUMAlink). Позже Origin 2000 породила новую систему - Origin 3000 , вышедшую с теми же максимальными 1024 ЦП, но использовавшую в разработке микросхемы R14000 и R16000 с частотой до 700 МГц. Однако, в 2005 году, когда SGI приняла стратегическое решение о переходе на архитектуру Intel IA-64, суперкомпьютеры, базированные на MIPS, были сняты с производства.

В 2007 году корпорация SiCortex представила новый многопроцессорный персональный суперкомпьютер, основанный на архитектуре MIPS. В его разработку легли MIPS64 и высокопроизводительная межсистемная связь с использованием топологии графов Кауца (англ. Kautz graph ). Данная система является предельно эффективной и вычислительно мощной. Её уникальный аспект - многоядерный узел обработки, интегрирующий шесть ядер MIPS64, коммутатор контроллера памяти, межсистемную связь механизмов прямого доступа к памяти, локальную сеть с пропускной способностью 1 Гбит и PCI Express контроллеры. И все это на одном кристалле, который потребляет 10 Вт энергии, но выполняет максимум 6 миллиардов операций с плавающей запятой в секунду. Самая мощная конфигурация такого суперкомпьютера - версия SC5832, состоящая из 972 узлов (всего 5832 ядер MIPS64) и выполняющая 8,2 триллионов операций с плавающей запятой в секунду.

Loongson возвращает к персонализации

Первым коммерческим микропроцессором с архитектурой MIPS был микропроцессор R2000 , представленный в 1985 году. В нём были реализованы операции умножения и деления, которые выполнялись за несколько тактов. Устройство умножения и деления не было тесно интегрировано в ядро процессора, хотя и размещалось на том же кристалле; по этой причине система команд расширена инструкциями для загрузки результатов умножения и деления в регистры общего назначения, эти инструкции блокировали конвейер.

Микропроцессор R2000 мог быть загружен как в режиме big-endian, так и в режиме little-endian, содержал тридцать два 32-разрядных регистра общего назначения. Подобно процессорам AMD 29000 и Alpha , микропроцессор R2000 не имел отдельного регистра флагов условий, так как разработчики посчитали его потенциальным «узким местом». Следует отметить, что счётчик команд непосредственно недоступен.

Микропроцессор R2000 поддерживал подключение до четырёх сопроцессоров, один из которых является встроенным и обеспечивает работу с исключениями, а также управление памятью (MMU). В случае необходимости в качестве ещё одного сопроцессора можно было подключить микросхему R2010, арифметический сопроцессор, который содержал тридцать два 32-разрядных регистра, которые можно было использовать как шестнадцать 64-разрядных регистров для работы с числами двойной точности. Следующим в семействе стал R3000 , который появился в 1988 году. Он содержал кэш-память данных объёмом 64 КБ (R2000 - 32 КБ). Кроме того, R3000 обеспечивал когерентность кэш-памяти при работе в мультипроцессорных конфигурациях. Несмотря на то, что в поддержке мультипроцессорности R3000 имеется ряд недостатков, на базе R3000 было создано несколько работоспособных многопроцессорных систем. Как и для R2000, для R3000 был создан арифметический сопроцессор в виде отдельной СБИС: R3010. Микропроцессор R3000 стал первым коммерчески успешным процессором с архитектурой MIPS, было изготовлено более миллиона процессоров. Ускоренная версия R3000, работающая на тактовой частоте 40 МГц, названная R3000A, достигла производительности в 32 VUPs (VAX Unit of Performance). Дальнейшее развитие R3000A, микропроцессор R3051, работающий на частоте 33,8688 МГц, был использован в игровой приставке Sony PlayStation. Другие производители также представили процессоры, совместимые с R3000A: в Performance Semiconductor был разработан R3400, в то время как компания IDT создала R3500, оба упомянутых процессора имели в интегрированный математический сопроцессор R3010. Первой системой на кристалле, использующей процессор с архитектурой MIPS, стала разработка R3900 фирмы Toshiba; данная микросхема использовалась в портативном компьютере, работавшем под управлением Windows CE. Был разработан радиационно-устойчивый вариант R3000 с интегрированным R3010, предназначенный для применения в космических аппаратах, который получил название Mongoose-V .

Серия R4000 , выпущенная в 1991 году, расширила процессоры MIPS до 64 битов. (MIPS Technology была первой компанией, выпустившей процессоры с 64-битовой архитектурой) R4000 состоит из 1,3 млн транзисторов, имеет встроенный кэш данных и кэш инструкций (оба по 8 Кб). В этом процессоре внешняя тактовая частота 50 МГц удваивается, а внутренняя тактовая частота составляет 100 МГц. Процессор R4400 выполнен на основе R4000, состоит из 2,2 млн транзисторов, имеет встроенный кэш данных и кэш инструкций (оба по 16 Кб), а внутренняя тактовая частота составляет 150 МГц. Набор команд этих процессоров (спецификация MIPS II) был расширен командами загрузки и записи 64-разрядных чисел с плавающей запятой, командами вычисления квадратного корня с одинарной и двойной точностью, командами условных прерываний, а также атомарными операциями, необходимыми для поддержки мультипроцессорных конфигураций. В процессорах R4000 и R4400 реализованы 64-битовые шины данных и 64-битовые регистры.

MIPS, теперь являющийся отделом SGI под названием MTI , разработал недорогие процессоры R4200, послужившие основой для будущих (ещё более дешёвых) R4300i. Производная этого процессора, NEC VR4300, использовалась в игровых консолях Nintendo 64 .


Quantum Effect Devices (QED), самостоятельная компания, основанная разработчиками MIPS, разработала серию процессоров R4600 Orion, R4700 Orion, R4650 и R5000. Если в R4000 увеличили тактовую частоту, но пожертвовали количеством кэш-памяти, то QED уделили большое внимание и ёмкости кэш-памяти (доступ к которой можно получить всего за 2 цикла), и эффективному использованию поверхности кристалла. Процессоры R4600 и R4700 использовались в недорогих версиях рабочей станции SGI Indy, а также в первых маршрутизаторах Cisco (основанных на MIPS), например, серии 36х0 и 7х00. Микропроцессор R4650 применялся в телевизионных приставках WebTV (в настоящее время - Microsoft TV). В процессоре R5000 FPU диспетчеризация операций с плавающей запятой (одинарной точности) была более гибкой, чем в R4000, и, вследствие этого, рабочие станции SGI Indys, базированные на R5000 отличались лучшей графической производительностью, чем R4400 с такой же тактовой скоростью и графическим аппаратным устройством. Чтобы подчеркнуть улучшение после объединения R5000 и старой графической платы, SGI дала ей новое название. Немного позднее QED разработали семейство процессоров RM7000 и RM9000 для рынка сетей и лазерных принтеров. В Августе 2000 года компания QED была приобретена производителем полупроводников PMC-Sierra, и последняя продолжила инвестирование MIPS-архитектур. Процессор RM7000 включал в себя 256 Кб встроенной кэш-памяти 2го уровня и контроллер для дополнительной кэш-памяти 3го уровня. Были созданы процессоры RM9xx0 - семейство SOC-устройств, в которые включены такие периферийные составляющие (на северном мосту), как: контроллер памяти, PCI-контроллер, контроллер Ethernet, а также быстрые устройства ввода-вывода (например, высокопроизводительная шина типа HyperTransport).

R8000 (представлен в 1994 году) был первой суперскалярной архитектурой MIPS, способной осуществлять 2 целочисленные инструкции (или с плавающей запятой) и 2 инструкции обращения к памяти за один цикл. Данная разработка использовала 6 схем: устройство для целочисленных команд (16 Кб - команды и 16 Кб - кэш данных), для команд с плавающей запятой, три вторичных дескриптора кэш-памяти ОЗУ (два для вторичного доступа к кэш-памяти + один для отслеживания шины), а также кэш-контроллер ASIC. Архитектура имеет два полностью конвейеризованных устройства умножения-сложения (с двойной точностью), которые могут передавать поток данных в 4 Мб внекристального вторичного кэша. В середине 1990-х процессоры R8000 запустили SGI серверы POWER Challenge, а позже стали доступны на рабочих станциях POWER Indigo2. Хотя производительность этого FPU и была наиболее подходящей для научных сотрудников, ограниченность его целочисленной производительности и высокая цена не смогли привлечь большинство пользователей, поэтому R8000 был на рынке всего год, и даже сейчас его едва ли можно найти.

В 1995 году был выпущен R10000 . Этот процессор в однокристальном исполнении, работал с более высокой тактовой частотой, чем R8000, а также включал в себя объемную (32 КБ) первичную кэш-память данных и команд. Кроме того, он был суперскалярным, но это главное новшество было неисправно. Но даже с более простым FPU, значительно увеличенная производительность целочисленный вычислений, более низкая цена и высокая плотность записи сделали R10000 предпочтительным для большинства пользователей.

Все более поздние проекты были основаны на ядре R10000 . В R12000 был использован 0.25 микронный технологический процесс с целью уменьшить чип и достигнуть большей тактовой скорости. Исправленный R14000 имел более высокую тактовую частоту в дополнение с поддержкой DDR SRAM для внекристальной кэш-памяти. Следом были выпущены R16000 и R16000A, тактовая частота которых была также увеличена; в них была встроена дополнительная кэш-память первого уровня, а их производство требовало более мелких кристаллов, чем прежде.

Среди других представителей семейства MIPS - R6000 , ЭСЛ-реализация, выполненная компанией Bipolar Integrated Technology . R6000 относится к поколению процессоров MIPS II. Его TLB и устройство кэш-памяти значительно отличаются от остальных представителей данного семейства. R6000 не принес обещанной выгоды, и, хотя был признан в некоторой степени полезным для компьютеров Control Data, он мгновенно исчез с основного рынка.

Микропроцессоры MIPS
Модель Частота (МГц) Год Технология разработки (µm) Транзисторы (млн.) Размер кристалла (мм²) Число выводов Мощность (Вт) Напряжение (В) Кэш данных (KБ) Кэш инструкций (KБ) Кэш 2го уровня Кэш 3го уровня
R2000 8-16.67 1985 2.0 0.11 ? ? ? ? 32 64 НЕТ НЕТ
R3000 12-40 1988 1.2 0.11 66.12 145 4 ? 64 64 0-256 Kб Внешняя НЕТ
R4000 100 1991 0.8 1.35 213 179 15 5 8 8 1 Mб Внешняя НЕТ
R4400 100-250 1992 0.6 2.3 186 179 15 5 16 16 1-4 Mб Внешняя НЕТ
R4600 100-133 1994 0.64 2.2 77 179 4.6 5 16 16 512 Kб Внешняя НЕТ
R4700 133 1996 ? ? ? 179 ? ? 16 16 Внешняя НЕТ
R5000 150-200 1996 0.35 3.7 84 223 10 3.3 32 32 1 Mб Внешняя НЕТ
R8000 75-90 1994 0.7 2.6 299 591+591 30 3.3 16 16 4 Mб Внешняя НЕТ
R10000 150-250 1996 0.35, 0.25 6.7 299 599 30 3.3 32 32 512 Kб-16 Mб Внешняя НЕТ
R12000 270-400 1998 0.25, 0.18 6.9 204 600 20 4 32 32 512 Kб-16 Mб Внешняя НЕТ
RM7000 250-600 1998 0.25, 0.18, 0.13 18 91 304 10, 6, 3 3.3, 2.5, 1.5 16 16 256 Kб Внутренняя 1 Mб Внешняя
R14000 500-600 2001 0.13 7.2 204 527 17 ? 32 32 512 Kб-16 Mб Внешняя НЕТ
R16000 700-1000 2002 0.11 ? ? ? 20 ? 64 64 512 Kб-16 Mб Внешняя НЕТ
R24K 750+ 2003 65 nm ? 0.83 ? ? ? 64 64 4-16 Mб Внешняя НЕТ

Формат инструкций MIPS I

Инструкции делятся на три типа: R, I и J. Каждая инструкция начинается с 6-битного кода. В дополнение к коду, инструкции R-типа определяют три регистра, область размера сдвига регистра, и область функции; инструкции I-типа определяют два регистра и непосредственное значение; инструкции J-типа состоят из кода операции и 26-битного адреса перехода.

Тип −31− формат (в битах) −0−
R код (6) rs (5) rt (5) rd (5) shamt (5) функция (6)
I код (6) rs (5) rt (5) непосредственное (16)
J код (6) адрес (26)

Язык ассемблера MIPS

Данные инструкции языка ассемблера имеют прямую аппаратную реализацию, в отличие от псевдоинструкций, которые перед сборкой транслируются в настоящие составные инструкции.

  • Далее регистровые буквы d, t, и s будут обозначать указатели на номера и имена регистров.
  • C обозначает константу.
  • Все последующие команды являются собственными.
  • Все коды операций и функций представлены в шестнадцатеричной системе счисления.
  • Набор инструкций MIPS32 идентифицирует, что число без знака, участвующее в сложении или вычитании, некорректно. Разницей между форматами числа со знаком и без является не увеличение длины операндов (или её уменьшение), а способность распознавать, было ли прерывание в случае переполнения, или же прерывание было проигнорировано. Операнд константа, в соответствие с этими инструкциями, всегда должен иметь знак.

Целочисленные операции

MIPS имеет 32 регистра для целочисленных операций. Для выполнения арифметических вычислений данные должны находиться в регистрах. Регистр $0 всегда хранит 0, а регистр $1 резервируется для сборки (для хранения псевдоинструкций и больших констант). Нижеприведенная таблица показывает, какие биты каким частям инструкции соответствуют. Дефис (-) обозначает нейтральное состояние.

Категория Название Синтаксис инструкции Значение Формат/код/функция Примечания/Кодирование
Арифметическая Add add $d,$s,$t $d = $s + $t R 0 20 16 Складывает два регистра, выполняет прерывание при переполнении
000000ss sssttttt ddddd--- --100000
Add unsigned addu $d,$s,$t $d = $s + $t R 0 21 16
000000ss sssttttt ddddd--- --100001
Subtract sub $d,$s,$t $d = $s − $t R 0 22 16 Вычитает два регистра, выполняет прерывание при переполнении
000000ss sssttttt ddddd--- --100010
Subtract unsigned subu $d,$s,$t $d = $s − $t R 0 23 16 Как и выше, но игнорирует переполнение
000000ss sssttttt ddddd000 00100011
Add immediate addi $t,$s,C $t = $s + C (знаковое) I 8 16 - Используется для сложения констант со знаками (а также для копирования одного регистра в другой: addi $1, $2, 0), выполняет прерывание при переполнении
001000ss sssttttt CCCCCCCC CCCCCCCC
Add immediate unsigned addiu $t,$s,C $t = $s + C (знаковое) I 9 16 - как и выше, но игнорирует переполнение, С остается знаковым
001001ss sssttttt CCCCCCCC CCCCCCCC
Multiply mult $s,$t LO = (($s * $t) << 32) >> 32;
HI = ($s * $t) >> 32;
R 0 18 16 Умножает два регистра и записывает 64-битный результат в два специальных поля для памяти - LO and HI. Аналогично можно записать результат операции в виде: (int HI,int LO) = (64-bit) $s * $t. См. mfhi и mflo для доступа к LO и HI регистрам.
Divide div $s, $t LO = $s / $t HI = $s % $t R 0 1A 16 Делит один регистр на другой и записывает 32-битный результат в LO, а остаток в HI .
Divide unsigned divu $s, $t LO = $s / $t HI = $s % $t R 0 1B 16 Делит один регистр на другой и записывает 32-битный результат в LO, а остаток - в HI.
Передача данных Load double word ld $t,C($s) $t = Memory[$s + C] I 23 16 - загружает double word из: MEM[$s+C] и следующих 7 байтов в $t и следующий регистр.
Load word lw $t,C($s) $t = Memory[$s + C] I 23 16 - загружает word из: MEM[$s+C] и следующих 3 байтов.
Load halfword lh $t,C($s) $t = Memory[$s + C] (знаковое) I 21 16 - загружает halfword из: MEM[$s+C] и следующего байта. Знак расширен до ширины регистра.
Load halfword unsigned lhu $t,C($s) $t = Memory[$s + C] (беззнаковое) I 25 16 -
Load byte lb $t,C($s) $t = Memory[$s + C] (signed) I 20 16 - загружает byte из: MEM[$s+C].
Load byte unsigned lbu $t,C($s) $t = Memory[$s + C] (unsigned) I 24 16 - Как и выше, но без расширения знака.
Store double word sd $t,C($s) Memory[$s + C] = $t I - сохраняет два типа word из $t и следующего регистра в: MEM[$s+C] и следующие 7 байтов. Порядок операндов может создать путаницу.
Store word sw $t,C($s) Memory[$s + C] = $t I 2B 16 - сохраняет word в: MEM[$s+C] и следующие 3 байта. Порядок операндов может создать путаницу.
Store half sh $t,C($s) Memory[$s + C] = $t I 29 16 - сохраняет первую половину регистра (halfword) в: MEM[$s+C] и следующий байт.
Store byte sb $t,C($s) Memory[$s + C] = $t I 28 16 - сохраняет первую четверть регистра (byte) в: MEM[$s+C].
Load upper immediate lui $t,C $t = C << 16 I F 16 - Загружает 16-битный операнд в вышестоящие 16 битов определенного регистра. Максимальная величина константы 2 16 −1
Move from high mfhi $d $d = HI R 0 10 16 Помещает значение из HI в регистр. Не используйте инструкции умножения и деления внутри инструкции mfhi (это действие не определено из-за конвейера MIPS).
Move from low mflo $d $d = LO R 0 12 16 Помещает значение из LO в регистр. Не используйте инструкции умножения и деления внутри инструкции mflo (это действие не определено из-за конвейера MIPS).
Move from Control Register mfcZ $t, $s $t = Coprocessor[Z].ControlRegister[$s] R 0 Перемещает 4-байтовое значение из сопроцессора регистра Z-контроля в регистр общего назначения. Расширение знака.
Move to Control Register mtcZ $t, $s Coprocessor[Z].ControlRegister[$s] = $t R 0 Перемещает 4-байтовое значение из регистра общего назначения в сопроцессор регистра Z-контроля. Расширение знака.
Логическая And and $d,$s,$t $d = $s & $t R 0 24 16 Побитовая конъюнкция
000000ss sssttttt ddddd--- --100100
And immediate andi $t,$s,C $t = $s & C I C 16 - 001100ss sssttttt CCCCCCCC CCCCCCCC
Or or $d,$s,$t $d = $s | $t R 0 25 16 Побитовая дизъюнкция
Or immediate ori $t,$s,C $t = $s | C I D 16 -
Exclusive or xor $d,$s,$t $d = $s ^ $t R 0 26 16
Nor nor $d,$s,$t $d = ~ ($s | $t) R 0 27 16 Bitwise nor
Set on less than slt $d,$s,$t $d = ($s < $t) R 0 2A 16 Проверяет, является ли один регистр меньше другого.
Set on less than immediate slti $t,$s,C $t = ($s < C) I A 16 - Проверяет, является ли один регистр меньше константы.
Битовый сдвиг Shift left logical sll $t,$s,C $t = $s << C R 0 0 сдвигает С битов влево (умножает степенями двойки 2^{CONST} )
Shift right logical srl $t,$s,C $t = $s >> C R 0 2 16 сдвигает С битов вправо (делит степенями двойки 2^{C} ). Заметьте, что эта инструкция работает как деление в дополнительным двоичном коде, только если значение положительно.
Shift right arithmetic sra $t,$s,C \scriptstyle $t = $s >> C + \left(\left(\sum_{n=1}^{\text{CONST}}2^{31-n}\right)\cdot $2>>31\right) R 0 3 16 сдвигает С битов - (делит в двоичном дополнительном коде степенями двойки)
Условное ветвление Branch on equal beq $s,$t,C if ($s == $t) go to PC+4+4 °C I 4 16 - Переходит к инструкции по указанному адресу, если два регистра равны.
000100ss sssttttt CCCCCCCC CCCCCCCC
Branch on not equal bne $s,$t,C if ($s != $t) go to PC+4+4 °C I 5 16 - Переходит к инструкции по указанному адресу, если два регистра не равны.
Безусловный переход Jump j C PC = PC+4 . C*4 J 2 16 - Выполняет безусловный переход к инструкции по указанному адресу.
Jump register jr $s goto address $s R 0 8 16 Переходит по адресу, содержащемуся в указанном регистре.
Jump and link jal C $31 = PC + 8; PC = PC+4 . C*4 J 3 16 - Как процедура - применяется для вызова подпрограммы, регистр $31 получает и возвращает адрес; возврат из подпрограммы совершает jr $31.

Примечание : в коде языка ассемблера MIPS, смещение для ветвящихся инструкций может быть представлено маркировками в другом месте кода.

Примечание : Не существует соответствующей команды «копирование в регистр» (load lower immediate); это можно сделать с помощью функций addi (add immediate) или ori (or immediate) c регистром $0. Например, обе команды addi $1, $0, 100 и ori $1, $0, 100 загружают в регистр $1 значение 100.

Операции над числами с плавающей запятой

MIPS имеет 32 регистра с плавающей запятой. Регистры соединены по 2 для двойной точности вычислений. Регистры с нечетными номерами не могут быть использованы для арифметических операций или ветвления, они могут лишь частично указывать двойную точность в паре регистров.

Категория Название Синтаксис инструкции Значение Формат/код/функция Примечания/Кодирование
Арифметические FP add single add.s $x,$y,$z $x = $y + $z Сложение чисел с плавающей запятой (одинарная точность)
FP subtract single sub.s $x,$y,$z $x = $y - $z Вычитание чисел с плавающей запятой (одинарная точность)
FP multiply single mul.s $x,$y,$z $x = $y * $z Умножение чисел с плавающей запятой (одинарная точность)
FP divide single div.s $x,$y,$z $x = $y / $z Деление чисел с плавающей запятой (одинарная точность)
FP add double add.d $x,$y,$z $x = $y + $z Сложение чисел с плавающей запятой (двойная точность)
FP subtract double sub.d $x,$y,$z $x = $y - $z Вычитание чисел с плавающей запятой (двойная точность)
FP multiply double mul.d $x,$y,$z $x = $y * $z Умножение чисел с плавающей запятой (двойная точность)
FP divide double div.d $x,$y,$z $x = $y / $z Деление чисел с плавающей запятой(двойная точность)
Передача данных Load word coprocessor lwcZ $x,CONST ($y) Coprocessor[Z].DataRegister[$x] = Memory[$y + CONST] I Загружает 4 байта типа word из: MEM[$2+CONST] в регистр данных сопроцессора. Расширение знака.
Store word coprocessor swcZ $x,CONST ($y) Memory[$y + CONST] = Coprocessor[Z].DataRegister[$x] I Записывает 4 байта из регистра данных сопроцессора в MEM[$2+CONST]. Расширение знака.
Логические FP compare single (eq, ne, lt, le, gt, ge) c.lt.s $f2,$f4 if ($f2 < $f4) cond=1; else cond=0 Сравнение на меньшее команд с плавающей запятой. Одинарная точность.
FP compare double (eq, ne, lt, le, gt, ge) c.lt.d $f2,$f4 if ($f2 < $f4) cond=1; else cond=0 Сравнение на меньшее команд с плавающей запятой. Двойная точность.
Ветвление branch on FP true bc1t 100 if (cond == 1) go to PC+4+100 если формат FP, выполняется ветвление.
branch on FP false bc1f 100 if (cond == 0) go to PC+4+100 если формат не FP, выполняется ветвление.

Псевдоинструкции

Эти инструкции принимаются языком ассемблера MIPS, однако они не являются реальными. Ассемблер переводит их в последовательности настоящих инструкций.

Название Синтаксис инструкции Трансляция в обычную инструкцию значение
Load Address la $1, LabelAddr lui $1, LabelAddr; ori $1,$1, LabelAddr $1 = Маркировка адреса
Load Immediate li $1, IMMED lui $1, IMMED; ori $1,$1, IMMED $1 = 32-битное прямое значение
Branch if greater than bgt $rs,$rt,Label slt $at,$rt,$rs; bne $at,$zero,Label if(R>R) PC=Label
Branch if less than blt $rs,$rt,Label slt $at,$rs,$rt; bne $at,$zero,Label if(R
Branch if greater than or equal bge etc. if(R>=R) PC=Label
Branch if less than or equal ble if(R<=R) PC=Label
Branch if greater than unsigned bgtu if(R=>R) PC=Label
Branch if greater than zero bgtz if(R>0) PC=Label
Multiplies and returns only first 32 bits mul $1, $2, $3 mult $2, $3; mflo $1 $1 = $2 * $3

Несколько других важных инструкций

  • NOP (без операции) (машинный код 0x00000000, интерпретируется процессором как sll $0, $0, 0)
  • Break (разрывы программы, используется отладчиками)
  • Системный вызов (используется для системных вызовов операционной системы)

Использование регистра транслирования

Аппаратная архитектура определяет следующие критерии:

  • Регистр общего назначения $0 всегда возвращает значение 0.
  • Регистр общего назначения $31 используется в качестве регистра-ссылки для команд перехода и связи.
  • HI и LO используются для доступа к результатам умножения/деления, доступ к которым осуществляется командами mfhi (move from high) и mflo (move from low).

Это единственные ограничения, которые аппаратная архитектура накладывает на использование регистров общего назначения.

Различные устройства MIPS реализовывают специальные соглашения о вызовах, которые ограничивают использование регистров. Соглашения о вызовах полностью поддерживаются комплексом ПО, но не требуются аппаратным обеспечением.

Регистры
Название Номер Применение нужно ли резервировать?
$zero $0 всегда хранит 0 N/A
$at $1 временный регистр для языка ассемблера НЕТ
$v0-$v1 $2–$3 значения функций и выражений НЕТ
$a0-$a3 $4–$7 аргументы функций НЕТ
$t0-$t7 $8–$15 временные НЕТ
$s0-$s7 $16–$23 сохраненные временные значения ДА
$t8-$t9 $24–$25 временные НЕТ
$k0-$k1 $26–$27 зарезервирована для ядра операционной системы НЕТ
$gp $28 глобальный указатель ДА
$sp $29 указатель стека ДА
$fp $30 указатель фрейма ДА
$ra $31 адрес возврата N/A

Защищенные регистры (по соглашению ) не могут быть изменены вызовом системы или процедуры (функции). Например, $s-регистры должны быть сохранены в стеке процедурой, которая собирается ими воспользоваться; к $sp и $fp-регистрам приращиваются константы, а по окончании процедуры регистры вновь уменьшаются. Противоположным примером служит регистр $ra, который автоматически меняется при его вызове любой функцией. $t-регистры должны сохраняться программой перед вызовом любой процедуры (если программе нужны данные, полученные после вызова).

Эмуляторы

Среди Open Virtual Platforms существует бесплатный эмулятор OVP-sim , доступный для некоммерческого использования, который представляет собой библиотеку моделей процессоров и платформ, а также интерфейсов API, позволяющих пользователю проектировать свои собственные модели. Библиотека моделей является открытым ресурсом, написанным на языке С, и включает в себя ядра MIPS 4K, 24K и 34K. Данные модели созданы и поддерживаются компанией Imperas, которая в сотрудничестве с MIPS Technologies протестировала эмулятор и отметила его знаком MIPS-Verified. Образцы платформ, основанных на MIPS, включают в себя как само металлическое оборудование, так и платформы для загрузки немодифицированных двоичных отображений Linux. Такие платформы-эмуляторы эффективны для обучения, а также доступны, бесплатны и просты в использовании. OVPsim , разработанный и поддерживаемый Imperas, работает с высокой скоростью (сотни миллионов инструкций с секунду), и применим для описания многоядерных архитектур.

Существует свободно доступный эмулятор MIPS32 (ранние версии могли имитировать только R2000/R3000 ), выпущенный под названием SPIM и предназначенный для использования в обучении. EduMIPS64 - это межплатформенный графический эмулятор процессора MIPS64, написанный на языке Java /Swing . Он поддерживает множество MIPS64 ISA и позволяет пользователю наглядно увидеть, что происходит в конвейере, когда ЦП выполняет программу на языке ассемблера. Проект имеет строго образовательные цели и широко используется на некоторых курсах компьютерной архитектуры во всем мире.

Ещё один GUI-эмулятор процессоров MIPS - это MARS , тоже разработанный в образовательных целях, особенно эффективен вкупе с книгой Хеннесси Computer Organization and Design .

Более продвинутые версии бесплатных эмуляторов - Gxemul (ранее известные как проекты mips64emul), а также проекты QEMU . Они имитируют различные модели микропроцессоров MIPS III и MIPS IV (в качестве дополнения к компьютерным системам, их использующим).

Коммерческие разработки эмуляторов доступны в основном для встроенного использования процессоров MIPS, например, Virtutech Simics (MIPS 4Kc и 5Kc, PMC RM9000, QED RM7000), VaST Systems (R3000, R4000), и CoWare (MIPS4KE, MIPS24K, MIPS25Kf и MIPS34K).

Список процессоров на базе архитектуры MIPS по компаниям

Напишите отзыв о статье "MIPS (архитектура)"

Примечания

Литература

  • David A. Patterson. Computer Organization and Design: The Hardware/Software Interface. - Morgan Kaufmann Publishers . - ISBN 1-55860-604-1 .
  • Dominic Sweetman. See MIPS Run, 2nd edition. - Morgan Kaufmann Publishers. - ISBN 0-12088-421-6 .
  • Dominic Sweetman. See MIPS Run. - Morgan Kaufmann Publishers. - ISBN 1-55860-410-3 .
  • Erin Farquhar. MIPS Programmer"s Handbook. - Morgan Kaufmann Publishers. - ISBN 1-55860-297-6 .

Ссылки

  • Full overview of MIPS architecture

Отрывок, характеризующий MIPS (архитектура)

«Никому не нужен я! – думал Ростов. – Некому ни помочь, ни пожалеть. А был же и я когда то дома, сильный, веселый, любимый». – Он вздохнул и со вздохом невольно застонал.
– Ай болит что? – спросил солдатик, встряхивая свою рубаху над огнем, и, не дожидаясь ответа, крякнув, прибавил: – Мало ли за день народу попортили – страсть!
Ростов не слушал солдата. Он смотрел на порхавшие над огнем снежинки и вспоминал русскую зиму с теплым, светлым домом, пушистою шубой, быстрыми санями, здоровым телом и со всею любовью и заботою семьи. «И зачем я пошел сюда!» думал он.
На другой день французы не возобновляли нападения, и остаток Багратионова отряда присоединился к армии Кутузова.

Князь Василий не обдумывал своих планов. Он еще менее думал сделать людям зло для того, чтобы приобрести выгоду. Он был только светский человек, успевший в свете и сделавший привычку из этого успеха. У него постоянно, смотря по обстоятельствам, по сближениям с людьми, составлялись различные планы и соображения, в которых он сам не отдавал себе хорошенько отчета, но которые составляли весь интерес его жизни. Не один и не два таких плана и соображения бывало у него в ходу, а десятки, из которых одни только начинали представляться ему, другие достигались, третьи уничтожались. Он не говорил себе, например: «Этот человек теперь в силе, я должен приобрести его доверие и дружбу и через него устроить себе выдачу единовременного пособия», или он не говорил себе: «Вот Пьер богат, я должен заманить его жениться на дочери и занять нужные мне 40 тысяч»; но человек в силе встречался ему, и в ту же минуту инстинкт подсказывал ему, что этот человек может быть полезен, и князь Василий сближался с ним и при первой возможности, без приготовления, по инстинкту, льстил, делался фамильярен, говорил о том, о чем нужно было.
Пьер был у него под рукою в Москве, и князь Василий устроил для него назначение в камер юнкеры, что тогда равнялось чину статского советника, и настоял на том, чтобы молодой человек с ним вместе ехал в Петербург и остановился в его доме. Как будто рассеянно и вместе с тем с несомненной уверенностью, что так должно быть, князь Василий делал всё, что было нужно для того, чтобы женить Пьера на своей дочери. Ежели бы князь Василий обдумывал вперед свои планы, он не мог бы иметь такой естественности в обращении и такой простоты и фамильярности в сношении со всеми людьми, выше и ниже себя поставленными. Что то влекло его постоянно к людям сильнее или богаче его, и он одарен был редким искусством ловить именно ту минуту, когда надо и можно было пользоваться людьми.
Пьер, сделавшись неожиданно богачом и графом Безухим, после недавнего одиночества и беззаботности, почувствовал себя до такой степени окруженным, занятым, что ему только в постели удавалось остаться одному с самим собою. Ему нужно было подписывать бумаги, ведаться с присутственными местами, о значении которых он не имел ясного понятия, спрашивать о чем то главного управляющего, ехать в подмосковное имение и принимать множество лиц, которые прежде не хотели и знать о его существовании, а теперь были бы обижены и огорчены, ежели бы он не захотел их видеть. Все эти разнообразные лица – деловые, родственники, знакомые – все были одинаково хорошо, ласково расположены к молодому наследнику; все они, очевидно и несомненно, были убеждены в высоких достоинствах Пьера. Беспрестанно он слышал слова: «С вашей необыкновенной добротой» или «при вашем прекрасном сердце», или «вы сами так чисты, граф…» или «ежели бы он был так умен, как вы» и т. п., так что он искренно начинал верить своей необыкновенной доброте и своему необыкновенному уму, тем более, что и всегда, в глубине души, ему казалось, что он действительно очень добр и очень умен. Даже люди, прежде бывшие злыми и очевидно враждебными, делались с ним нежными и любящими. Столь сердитая старшая из княжен, с длинной талией, с приглаженными, как у куклы, волосами, после похорон пришла в комнату Пьера. Опуская глаза и беспрестанно вспыхивая, она сказала ему, что очень жалеет о бывших между ними недоразумениях и что теперь не чувствует себя вправе ничего просить, разве только позволения, после постигшего ее удара, остаться на несколько недель в доме, который она так любила и где столько принесла жертв. Она не могла удержаться и заплакала при этих словах. Растроганный тем, что эта статуеобразная княжна могла так измениться, Пьер взял ее за руку и просил извинения, сам не зная, за что. С этого дня княжна начала вязать полосатый шарф для Пьера и совершенно изменилась к нему.
– Сделай это для нее, mon cher; всё таки она много пострадала от покойника, – сказал ему князь Василий, давая подписать какую то бумагу в пользу княжны.
Князь Василий решил, что эту кость, вексель в 30 т., надо было всё таки бросить бедной княжне с тем, чтобы ей не могло притти в голову толковать об участии князя Василия в деле мозаикового портфеля. Пьер подписал вексель, и с тех пор княжна стала еще добрее. Младшие сестры стали также ласковы к нему, в особенности самая младшая, хорошенькая, с родинкой, часто смущала Пьера своими улыбками и смущением при виде его.
Пьеру так естественно казалось, что все его любят, так казалось бы неестественно, ежели бы кто нибудь не полюбил его, что он не мог не верить в искренность людей, окружавших его. Притом ему не было времени спрашивать себя об искренности или неискренности этих людей. Ему постоянно было некогда, он постоянно чувствовал себя в состоянии кроткого и веселого опьянения. Он чувствовал себя центром какого то важного общего движения; чувствовал, что от него что то постоянно ожидается; что, не сделай он того, он огорчит многих и лишит их ожидаемого, а сделай то то и то то, всё будет хорошо, – и он делал то, что требовали от него, но это что то хорошее всё оставалось впереди.
Более всех других в это первое время как делами Пьера, так и им самим овладел князь Василий. Со смерти графа Безухого он не выпускал из рук Пьера. Князь Василий имел вид человека, отягченного делами, усталого, измученного, но из сострадания не могущего, наконец, бросить на произвол судьбы и плутов этого беспомощного юношу, сына его друга, apres tout, [в конце концов,] и с таким огромным состоянием. В те несколько дней, которые он пробыл в Москве после смерти графа Безухого, он призывал к себе Пьера или сам приходил к нему и предписывал ему то, что нужно было делать, таким тоном усталости и уверенности, как будто он всякий раз приговаривал:
«Vous savez, que je suis accable d"affaires et que ce n"est que par pure charite, que je m"occupe de vous, et puis vous savez bien, que ce que je vous propose est la seule chose faisable». [Ты знаешь, я завален делами; но было бы безжалостно покинуть тебя так; разумеется, что я тебе говорю, есть единственно возможное.]
– Ну, мой друг, завтра мы едем, наконец, – сказал он ему однажды, закрывая глаза, перебирая пальцами его локоть и таким тоном, как будто то, что он говорил, было давным давно решено между ними и не могло быть решено иначе.
– Завтра мы едем, я тебе даю место в своей коляске. Я очень рад. Здесь у нас всё важное покончено. А мне уж давно бы надо. Вот я получил от канцлера. Я его просил о тебе, и ты зачислен в дипломатический корпус и сделан камер юнкером. Теперь дипломатическая дорога тебе открыта.
Несмотря на всю силу тона усталости и уверенности, с которой произнесены были эти слова, Пьер, так долго думавший о своей карьере, хотел было возражать. Но князь Василий перебил его тем воркующим, басистым тоном, который исключал возможность перебить его речь и который употреблялся им в случае необходимости крайнего убеждения.
– Mais, mon cher, [Но, мой милый,] я это сделал для себя, для своей совести, и меня благодарить нечего. Никогда никто не жаловался, что его слишком любили; а потом, ты свободен, хоть завтра брось. Вот ты всё сам в Петербурге увидишь. И тебе давно пора удалиться от этих ужасных воспоминаний. – Князь Василий вздохнул. – Так так, моя душа. А мой камердинер пускай в твоей коляске едет. Ах да, я было и забыл, – прибавил еще князь Василий, – ты знаешь, mon cher, что у нас были счеты с покойным, так с рязанского я получил и оставлю: тебе не нужно. Мы с тобою сочтемся.
То, что князь Василий называл с «рязанского», было несколько тысяч оброка, которые князь Василий оставил у себя.
В Петербурге, так же как и в Москве, атмосфера нежных, любящих людей окружила Пьера. Он не мог отказаться от места или, скорее, звания (потому что он ничего не делал), которое доставил ему князь Василий, а знакомств, зовов и общественных занятий было столько, что Пьер еще больше, чем в Москве, испытывал чувство отуманенности, торопливости и всё наступающего, но не совершающегося какого то блага.
Из прежнего его холостого общества многих не было в Петербурге. Гвардия ушла в поход. Долохов был разжалован, Анатоль находился в армии, в провинции, князь Андрей был за границей, и потому Пьеру не удавалось ни проводить ночей, как он прежде любил проводить их, ни отводить изредка душу в дружеской беседе с старшим уважаемым другом. Всё время его проходило на обедах, балах и преимущественно у князя Василия – в обществе толстой княгини, его жены, и красавицы Элен.
Анна Павловна Шерер, так же как и другие, выказала Пьеру перемену, происшедшую в общественном взгляде на него.
Прежде Пьер в присутствии Анны Павловны постоянно чувствовал, что то, что он говорит, неприлично, бестактно, не то, что нужно; что речи его, кажущиеся ему умными, пока он готовит их в своем воображении, делаются глупыми, как скоро он громко выговорит, и что, напротив, самые тупые речи Ипполита выходят умными и милыми. Теперь всё, что ни говорил он, всё выходило charmant [очаровательно]. Ежели даже Анна Павловна не говорила этого, то он видел, что ей хотелось это сказать, и она только, в уважение его скромности, воздерживалась от этого.
В начале зимы с 1805 на 1806 год Пьер получил от Анны Павловны обычную розовую записку с приглашением, в котором было прибавлено: «Vous trouverez chez moi la belle Helene, qu"on ne se lasse jamais de voir». [у меня будет прекрасная Элен, на которую никогда не устанешь любоваться.]
Читая это место, Пьер в первый раз почувствовал, что между ним и Элен образовалась какая то связь, признаваемая другими людьми, и эта мысль в одно и то же время и испугала его, как будто на него накладывалось обязательство, которое он не мог сдержать, и вместе понравилась ему, как забавное предположение.
Вечер Анны Павловны был такой же, как и первый, только новинкой, которою угощала Анна Павловна своих гостей, был теперь не Мортемар, а дипломат, приехавший из Берлина и привезший самые свежие подробности о пребывании государя Александра в Потсдаме и о том, как два высочайшие друга поклялись там в неразрывном союзе отстаивать правое дело против врага человеческого рода. Пьер был принят Анной Павловной с оттенком грусти, относившейся, очевидно, к свежей потере, постигшей молодого человека, к смерти графа Безухого (все постоянно считали долгом уверять Пьера, что он очень огорчен кончиною отца, которого он почти не знал), – и грусти точно такой же, как и та высочайшая грусть, которая выражалась при упоминаниях об августейшей императрице Марии Феодоровне. Пьер почувствовал себя польщенным этим. Анна Павловна с своим обычным искусством устроила кружки своей гостиной. Большой кружок, где были князь Василий и генералы, пользовался дипломатом. Другой кружок был у чайного столика. Пьер хотел присоединиться к первому, но Анна Павловна, находившаяся в раздраженном состоянии полководца на поле битвы, когда приходят тысячи новых блестящих мыслей, которые едва успеваешь приводить в исполнение, Анна Павловна, увидев Пьера, тронула его пальцем за рукав.
– Attendez, j"ai des vues sur vous pour ce soir. [У меня есть на вас виды в этот вечер.] Она взглянула на Элен и улыбнулась ей. – Ma bonne Helene, il faut, que vous soyez charitable pour ma рauvre tante, qui a une adoration pour vous. Allez lui tenir compagnie pour 10 minutes. [Моя милая Элен, надо, чтобы вы были сострадательны к моей бедной тетке, которая питает к вам обожание. Побудьте с ней минут 10.] А чтоб вам не очень скучно было, вот вам милый граф, который не откажется за вами следовать.
Красавица направилась к тетушке, но Пьера Анна Павловна еще удержала подле себя, показывая вид, как будто ей надо сделать еще последнее необходимое распоряжение.
– Не правда ли, она восхитительна? – сказала она Пьеру, указывая на отплывающую величавую красавицу. – Et quelle tenue! [И как держит себя!] Для такой молодой девушки и такой такт, такое мастерское уменье держать себя! Это происходит от сердца! Счастлив будет тот, чьей она будет! С нею самый несветский муж будет невольно занимать самое блестящее место в свете. Не правда ли? Я только хотела знать ваше мнение, – и Анна Павловна отпустила Пьера.
Пьер с искренностью отвечал Анне Павловне утвердительно на вопрос ее об искусстве Элен держать себя. Ежели он когда нибудь думал об Элен, то думал именно о ее красоте и о том не обыкновенном ее спокойном уменьи быть молчаливо достойною в свете.
Тетушка приняла в свой уголок двух молодых людей, но, казалось, желала скрыть свое обожание к Элен и желала более выразить страх перед Анной Павловной. Она взглядывала на племянницу, как бы спрашивая, что ей делать с этими людьми. Отходя от них, Анна Павловна опять тронула пальчиком рукав Пьера и проговорила:
– J"espere, que vous ne direz plus qu"on s"ennuie chez moi, [Надеюсь, вы не скажете другой раз, что у меня скучают,] – и взглянула на Элен.
Элен улыбнулась с таким видом, который говорил, что она не допускала возможности, чтобы кто либо мог видеть ее и не быть восхищенным. Тетушка прокашлялась, проглотила слюни и по французски сказала, что она очень рада видеть Элен; потом обратилась к Пьеру с тем же приветствием и с той же миной. В середине скучливого и спотыкающегося разговора Элен оглянулась на Пьера и улыбнулась ему той улыбкой, ясной, красивой, которой она улыбалась всем. Пьер так привык к этой улыбке, так мало она выражала для него, что он не обратил на нее никакого внимания. Тетушка говорила в это время о коллекции табакерок, которая была у покойного отца Пьера, графа Безухого, и показала свою табакерку. Княжна Элен попросила посмотреть портрет мужа тетушки, который был сделан на этой табакерке.
– Это, верно, делано Винесом, – сказал Пьер, называя известного миниатюриста, нагибаясь к столу, чтоб взять в руки табакерку, и прислушиваясь к разговору за другим столом.
Он привстал, желая обойти, но тетушка подала табакерку прямо через Элен, позади ее. Элен нагнулась вперед, чтобы дать место, и, улыбаясь, оглянулась. Она была, как и всегда на вечерах, в весьма открытом по тогдашней моде спереди и сзади платье. Ее бюст, казавшийся всегда мраморным Пьеру, находился в таком близком расстоянии от его глаз, что он своими близорукими глазами невольно различал живую прелесть ее плеч и шеи, и так близко от его губ, что ему стоило немного нагнуться, чтобы прикоснуться до нее. Он слышал тепло ее тела, запах духов и скрып ее корсета при движении. Он видел не ее мраморную красоту, составлявшую одно целое с ее платьем, он видел и чувствовал всю прелесть ее тела, которое было закрыто только одеждой. И, раз увидав это, он не мог видеть иначе, как мы не можем возвратиться к раз объясненному обману.
«Так вы до сих пор не замечали, как я прекрасна? – как будто сказала Элен. – Вы не замечали, что я женщина? Да, я женщина, которая может принадлежать всякому и вам тоже», сказал ее взгляд. И в ту же минуту Пьер почувствовал, что Элен не только могла, но должна была быть его женою, что это не может быть иначе.
Он знал это в эту минуту так же верно, как бы он знал это, стоя под венцом с нею. Как это будет? и когда? он не знал; не знал даже, хорошо ли это будет (ему даже чувствовалось, что это нехорошо почему то), но он знал, что это будет.
Пьер опустил глаза, опять поднял их и снова хотел увидеть ее такою дальнею, чужою для себя красавицею, какою он видал ее каждый день прежде; но он не мог уже этого сделать. Не мог, как не может человек, прежде смотревший в тумане на былинку бурьяна и видевший в ней дерево, увидав былинку, снова увидеть в ней дерево. Она была страшно близка ему. Она имела уже власть над ним. И между ним и ею не было уже никаких преград, кроме преград его собственной воли.
– Bon, je vous laisse dans votre petit coin. Je vois, que vous y etes tres bien, [Хорошо, я вас оставлю в вашем уголке. Я вижу, вам там хорошо,] – сказал голос Анны Павловны.
И Пьер, со страхом вспоминая, не сделал ли он чего нибудь предосудительного, краснея, оглянулся вокруг себя. Ему казалось, что все знают, так же как и он, про то, что с ним случилось.
Через несколько времени, когда он подошел к большому кружку, Анна Павловна сказала ему:
– On dit que vous embellissez votre maison de Petersbourg. [Говорят, вы отделываете свой петербургский дом.]
(Это была правда: архитектор сказал, что это нужно ему, и Пьер, сам не зная, зачем, отделывал свой огромный дом в Петербурге.)
– C"est bien, mais ne demenagez pas de chez le prince Ваsile. Il est bon d"avoir un ami comme le prince, – сказала она, улыбаясь князю Василию. – J"en sais quelque chose. N"est ce pas? [Это хорошо, но не переезжайте от князя Василия. Хорошо иметь такого друга. Я кое что об этом знаю. Не правда ли?] А вы еще так молоды. Вам нужны советы. Вы не сердитесь на меня, что я пользуюсь правами старух. – Она замолчала, как молчат всегда женщины, чего то ожидая после того, как скажут про свои года. – Если вы женитесь, то другое дело. – И она соединила их в один взгляд. Пьер не смотрел на Элен, и она на него. Но она была всё так же страшно близка ему. Он промычал что то и покраснел.
Вернувшись домой, Пьер долго не мог заснуть, думая о том, что с ним случилось. Что же случилось с ним? Ничего. Он только понял, что женщина, которую он знал ребенком, про которую он рассеянно говорил: «да, хороша», когда ему говорили, что Элен красавица, он понял, что эта женщина может принадлежать ему.
«Но она глупа, я сам говорил, что она глупа, – думал он. – Что то гадкое есть в том чувстве, которое она возбудила во мне, что то запрещенное. Мне говорили, что ее брат Анатоль был влюблен в нее, и она влюблена в него, что была целая история, и что от этого услали Анатоля. Брат ее – Ипполит… Отец ее – князь Василий… Это нехорошо», думал он; и в то же время как он рассуждал так (еще рассуждения эти оставались неоконченными), он заставал себя улыбающимся и сознавал, что другой ряд рассуждений всплывал из за первых, что он в одно и то же время думал о ее ничтожестве и мечтал о том, как она будет его женой, как она может полюбить его, как она может быть совсем другою, и как всё то, что он об ней думал и слышал, может быть неправдою. И он опять видел ее не какою то дочерью князя Василья, а видел всё ее тело, только прикрытое серым платьем. «Но нет, отчего же прежде не приходила мне в голову эта мысль?» И опять он говорил себе, что это невозможно; что что то гадкое, противоестественное, как ему казалось, нечестное было бы в этом браке. Он вспоминал ее прежние слова, взгляды, и слова и взгляды тех, кто их видал вместе. Он вспомнил слова и взгляды Анны Павловны, когда она говорила ему о доме, вспомнил тысячи таких намеков со стороны князя Василья и других, и на него нашел ужас, не связал ли он уж себя чем нибудь в исполнении такого дела, которое, очевидно, нехорошо и которое он не должен делать. Но в то же время, как он сам себе выражал это решение, с другой стороны души всплывал ее образ со всею своею женственной красотою.

В ноябре месяце 1805 года князь Василий должен был ехать на ревизию в четыре губернии. Он устроил для себя это назначение с тем, чтобы побывать заодно в своих расстроенных имениях, и захватив с собой (в месте расположения его полка) сына Анатоля, с ним вместе заехать к князю Николаю Андреевичу Болконскому с тем, чтоб женить сына на дочери этого богатого старика. Но прежде отъезда и этих новых дел, князю Василью нужно было решить дела с Пьером, который, правда, последнее время проводил целые дни дома, т. е. у князя Василья, у которого он жил, был смешон, взволнован и глуп (как должен быть влюбленный) в присутствии Элен, но всё еще не делал предложения.
«Tout ca est bel et bon, mais il faut que ca finisse», [Всё это хорошо, но надо это кончить,] – сказал себе раз утром князь Василий со вздохом грусти, сознавая, что Пьер, стольким обязанный ему (ну, да Христос с ним!), не совсем хорошо поступает в этом деле. «Молодость… легкомыслие… ну, да Бог с ним, – подумал князь Василий, с удовольствием чувствуя свою доброту: – mais il faut, que ca finisse. После завтра Лёлины именины, я позову кое кого, и ежели он не поймет, что он должен сделать, то уже это будет мое дело. Да, мое дело. Я – отец!»
Пьер полтора месяца после вечера Анны Павловны и последовавшей за ним бессонной, взволнованной ночи, в которую он решил, что женитьба на Элен была бы несчастие, и что ему нужно избегать ее и уехать, Пьер после этого решения не переезжал от князя Василья и с ужасом чувствовал, что каждый день он больше и больше в глазах людей связывается с нею, что он не может никак возвратиться к своему прежнему взгляду на нее, что он не может и оторваться от нее, что это будет ужасно, но что он должен будет связать с нею свою судьбу. Может быть, он и мог бы воздержаться, но не проходило дня, чтобы у князя Василья (у которого редко бывал прием) не было бы вечера, на котором должен был быть Пьер, ежели он не хотел расстроить общее удовольствие и обмануть ожидания всех. Князь Василий в те редкие минуты, когда бывал дома, проходя мимо Пьера, дергал его за руку вниз, рассеянно подставлял ему для поцелуя выбритую, морщинистую щеку и говорил или «до завтра», или «к обеду, а то я тебя не увижу», или «я для тебя остаюсь» и т. п. Но несмотря на то, что, когда князь Василий оставался для Пьера (как он это говорил), он не говорил с ним двух слов, Пьер не чувствовал себя в силах обмануть его ожидания. Он каждый день говорил себе всё одно и одно: «Надо же, наконец, понять ее и дать себе отчет: кто она? Ошибался ли я прежде или теперь ошибаюсь? Нет, она не глупа; нет, она прекрасная девушка! – говорил он сам себе иногда. – Никогда ни в чем она не ошибается, никогда она ничего не сказала глупого. Она мало говорит, но то, что она скажет, всегда просто и ясно. Так она не глупа. Никогда она не смущалась и не смущается. Так она не дурная женщина!» Часто ему случалось с нею начинать рассуждать, думать вслух, и всякий раз она отвечала ему на это либо коротким, но кстати сказанным замечанием, показывавшим, что ее это не интересует, либо молчаливой улыбкой и взглядом, которые ощутительнее всего показывали Пьеру ее превосходство. Она была права, признавая все рассуждения вздором в сравнении с этой улыбкой.
Она обращалась к нему всегда с радостной, доверчивой, к нему одному относившейся улыбкой, в которой было что то значительней того, что было в общей улыбке, украшавшей всегда ее лицо. Пьер знал, что все ждут только того, чтобы он, наконец, сказал одно слово, переступил через известную черту, и он знал, что он рано или поздно переступит через нее; но какой то непонятный ужас охватывал его при одной мысли об этом страшном шаге. Тысячу раз в продолжение этого полутора месяца, во время которого он чувствовал себя всё дальше и дальше втягиваемым в ту страшившую его пропасть, Пьер говорил себе: «Да что ж это? Нужна решимость! Разве нет у меня ее?»
Он хотел решиться, но с ужасом чувствовал, что не было у него в этом случае той решимости, которую он знал в себе и которая действительно была в нем. Пьер принадлежал к числу тех людей, которые сильны только тогда, когда они чувствуют себя вполне чистыми. А с того дня, как им владело то чувство желания, которое он испытал над табакеркой у Анны Павловны, несознанное чувство виноватости этого стремления парализировало его решимость.
В день именин Элен у князя Василья ужинало маленькое общество людей самых близких, как говорила княгиня, родные и друзья. Всем этим родным и друзьям дано было чувствовать, что в этот день должна решиться участь именинницы.
Гости сидели за ужином. Княгиня Курагина, массивная, когда то красивая, представительная женщина сидела на хозяйском месте. По обеим сторонам ее сидели почетнейшие гости – старый генерал, его жена, Анна Павловна Шерер; в конце стола сидели менее пожилые и почетные гости, и там же сидели домашние, Пьер и Элен, – рядом. Князь Василий не ужинал: он похаживал вокруг стола, в веселом расположении духа, подсаживаясь то к тому, то к другому из гостей. Каждому он говорил небрежное и приятное слово, исключая Пьера и Элен, которых присутствия он не замечал, казалось. Князь Василий оживлял всех. Ярко горели восковые свечи, блестели серебро и хрусталь посуды, наряды дам и золото и серебро эполет; вокруг стола сновали слуги в красных кафтанах; слышались звуки ножей, стаканов, тарелок и звуки оживленного говора нескольких разговоров вокруг этого стола. Слышно было, как старый камергер в одном конце уверял старушку баронессу в своей пламенной любви к ней и ее смех; с другой – рассказ о неуспехе какой то Марьи Викторовны. У середины стола князь Василий сосредоточил вокруг себя слушателей. Он рассказывал дамам, с шутливой улыбкой на губах, последнее – в среду – заседание государственного совета, на котором был получен и читался Сергеем Кузьмичем Вязмитиновым, новым петербургским военным генерал губернатором, знаменитый тогда рескрипт государя Александра Павловича из армии, в котором государь, обращаясь к Сергею Кузьмичу, говорил, что со всех сторон получает он заявления о преданности народа, и что заявление Петербурга особенно приятно ему, что он гордится честью быть главою такой нации и постарается быть ее достойным. Рескрипт этот начинался словами: Сергей Кузьмич! Со всех сторон доходят до меня слухи и т. д.
– Так таки и не пошло дальше, чем «Сергей Кузьмич»? – спрашивала одна дама.
– Да, да, ни на волос, – отвечал смеясь князь Василий. – Сергей Кузьмич… со всех сторон. Со всех сторон, Сергей Кузьмич… Бедный Вязмитинов никак не мог пойти далее. Несколько раз он принимался снова за письмо, но только что скажет Сергей … всхлипывания… Ку…зьми…ч – слезы… и со всех сторон заглушаются рыданиями, и дальше он не мог. И опять платок, и опять «Сергей Кузьмич, со всех сторон», и слезы… так что уже попросили прочесть другого.
– Кузьмич… со всех сторон… и слезы… – повторил кто то смеясь.
– Не будьте злы, – погрозив пальцем, с другого конца стола, проговорила Анна Павловна, – c"est un si brave et excellent homme notre bon Viasmitinoff… [Это такой прекрасный человек, наш добрый Вязмитинов…]
Все очень смеялись. На верхнем почетном конце стола все были, казалось, веселы и под влиянием самых различных оживленных настроений; только Пьер и Элен молча сидели рядом почти на нижнем конце стола; на лицах обоих сдерживалась сияющая улыбка, не зависящая от Сергея Кузьмича, – улыбка стыдливости перед своими чувствами. Что бы ни говорили и как бы ни смеялись и шутили другие, как бы аппетитно ни кушали и рейнвейн, и соте, и мороженое, как бы ни избегали взглядом эту чету, как бы ни казались равнодушны, невнимательны к ней, чувствовалось почему то, по изредка бросаемым на них взглядам, что и анекдот о Сергее Кузьмиче, и смех, и кушанье – всё было притворно, а все силы внимания всего этого общества были обращены только на эту пару – Пьера и Элен. Князь Василий представлял всхлипыванья Сергея Кузьмича и в это время обегал взглядом дочь; и в то время как он смеялся, выражение его лица говорило: «Так, так, всё хорошо идет; нынче всё решится». Анна Павловна грозила ему за notre bon Viasmitinoff, а в глазах ее, которые мельком блеснули в этот момент на Пьера, князь Василий читал поздравление с будущим зятем и счастием дочери. Старая княгиня, предлагая с грустным вздохом вина своей соседке и сердито взглянув на дочь, этим вздохом как будто говорила: «да, теперь нам с вами ничего больше не осталось, как пить сладкое вино, моя милая; теперь время этой молодежи быть так дерзко вызывающе счастливой». «И что за глупость всё то, что я рассказываю, как будто это меня интересует, – думал дипломат, взглядывая на счастливые лица любовников – вот это счастие!»
Среди тех ничтожно мелких, искусственных интересов, которые связывали это общество, попало простое чувство стремления красивых и здоровых молодых мужчины и женщины друг к другу. И это человеческое чувство подавило всё и парило над всем их искусственным лепетом. Шутки были невеселы, новости неинтересны, оживление – очевидно поддельно. Не только они, но лакеи, служившие за столом, казалось, чувствовали то же и забывали порядки службы, заглядываясь на красавицу Элен с ее сияющим лицом и на красное, толстое, счастливое и беспокойное лицо Пьера. Казалось, и огни свечей сосредоточены были только на этих двух счастливых лицах.
Пьер чувствовал, что он был центром всего, и это положение и радовало и стесняло его. Он находился в состоянии человека, углубленного в какое нибудь занятие. Он ничего ясно не видел, не понимал и не слыхал. Только изредка, неожиданно, мелькали в его душе отрывочные мысли и впечатления из действительности.
«Так уж всё кончено! – думал он. – И как это всё сделалось? Так быстро! Теперь я знаю, что не для нее одной, не для себя одного, но и для всех это должно неизбежно свершиться. Они все так ждут этого, так уверены, что это будет, что я не могу, не могу обмануть их. Но как это будет? Не знаю; а будет, непременно будет!» думал Пьер, взглядывая на эти плечи, блестевшие подле самых глаз его.
То вдруг ему становилось стыдно чего то. Ему неловко было, что он один занимает внимание всех, что он счастливец в глазах других, что он с своим некрасивым лицом какой то Парис, обладающий Еленой. «Но, верно, это всегда так бывает и так надо, – утешал он себя. – И, впрочем, что же я сделал для этого? Когда это началось? Из Москвы я поехал вместе с князем Васильем. Тут еще ничего не было. Потом, отчего же мне было у него не остановиться? Потом я играл с ней в карты и поднял ее ридикюль, ездил с ней кататься. Когда же это началось, когда это всё сделалось? И вот он сидит подле нее женихом; слышит, видит, чувствует ее близость, ее дыхание, ее движения, ее красоту. То вдруг ему кажется, что это не она, а он сам так необыкновенно красив, что оттого то и смотрят так на него, и он, счастливый общим удивлением, выпрямляет грудь, поднимает голову и радуется своему счастью. Вдруг какой то голос, чей то знакомый голос, слышится и говорит ему что то другой раз. Но Пьер так занят, что не понимает того, что говорят ему. – Я спрашиваю у тебя, когда ты получил письмо от Болконского, – повторяет третий раз князь Василий. – Как ты рассеян, мой милый.
Князь Василий улыбается, и Пьер видит, что все, все улыбаются на него и на Элен. «Ну, что ж, коли вы все знаете», говорил сам себе Пьер. «Ну, что ж? это правда», и он сам улыбался своей кроткой, детской улыбкой, и Элен улыбается.
– Когда же ты получил? Из Ольмюца? – повторяет князь Василий, которому будто нужно это знать для решения спора.
«И можно ли говорить и думать о таких пустяках?» думает Пьер.
– Да, из Ольмюца, – отвечает он со вздохом.
От ужина Пьер повел свою даму за другими в гостиную. Гости стали разъезжаться и некоторые уезжали, не простившись с Элен. Как будто не желая отрывать ее от ее серьезного занятия, некоторые подходили на минуту и скорее отходили, запрещая ей провожать себя. Дипломат грустно молчал, выходя из гостиной. Ему представлялась вся тщета его дипломатической карьеры в сравнении с счастьем Пьера. Старый генерал сердито проворчал на свою жену, когда она спросила его о состоянии его ноги. «Эка, старая дура, – подумал он. – Вот Елена Васильевна так та и в 50 лет красавица будет».
– Кажется, что я могу вас поздравить, – прошептала Анна Павловна княгине и крепко поцеловала ее. – Ежели бы не мигрень, я бы осталась.
Княгиня ничего не отвечала; ее мучила зависть к счастью своей дочери.
Пьер во время проводов гостей долго оставался один с Элен в маленькой гостиной, где они сели. Он часто и прежде, в последние полтора месяца, оставался один с Элен, но никогда не говорил ей о любви. Теперь он чувствовал, что это было необходимо, но он никак не мог решиться на этот последний шаг. Ему было стыдно; ему казалось, что тут, подле Элен, он занимает чье то чужое место. Не для тебя это счастье, – говорил ему какой то внутренний голос. – Это счастье для тех, у кого нет того, что есть у тебя. Но надо было сказать что нибудь, и он заговорил. Он спросил у нее, довольна ли она нынешним вечером? Она, как и всегда, с простотой своей отвечала, что нынешние именины были для нее одними из самых приятных.
Кое кто из ближайших родных еще оставались. Они сидели в большой гостиной. Князь Василий ленивыми шагами подошел к Пьеру. Пьер встал и сказал, что уже поздно. Князь Василий строго вопросительно посмотрел на него, как будто то, что он сказал, было так странно, что нельзя было и расслышать. Но вслед за тем выражение строгости изменилось, и князь Василий дернул Пьера вниз за руку, посадил его и ласково улыбнулся.
– Ну, что, Леля? – обратился он тотчас же к дочери с тем небрежным тоном привычной нежности, который усвоивается родителями, с детства ласкающими своих детей, но который князем Василием был только угадан посредством подражания другим родителям.
И он опять обратился к Пьеру.
– Сергей Кузьмич, со всех сторон, – проговорил он, расстегивая верхнюю пуговицу жилета.
Пьер улыбнулся, но по его улыбке видно было, что он понимал, что не анекдот Сергея Кузьмича интересовал в это время князя Василия; и князь Василий понял, что Пьер понимал это. Князь Василий вдруг пробурлил что то и вышел. Пьеру показалось, что даже князь Василий был смущен. Вид смущенья этого старого светского человека тронул Пьера; он оглянулся на Элен – и она, казалось, была смущена и взглядом говорила: «что ж, вы сами виноваты».
«Надо неизбежно перешагнуть, но не могу, я не могу», думал Пьер, и заговорил опять о постороннем, о Сергее Кузьмиче, спрашивая, в чем состоял этот анекдот, так как он его не расслышал. Элен с улыбкой отвечала, что она тоже не знает.
Когда князь Василий вошел в гостиную, княгиня тихо говорила с пожилой дамой о Пьере.
– Конечно, c"est un parti tres brillant, mais le bonheur, ma chere… – Les Marieiages se font dans les cieux, [Конечно, это очень блестящая партия, но счастье, моя милая… – Браки совершаются на небесах,] – отвечала пожилая дама.
Князь Василий, как бы не слушая дам, прошел в дальний угол и сел на диван. Он закрыл глаза и как будто дремал. Голова его было упала, и он очнулся.
– Aline, – сказал он жене, – allez voir ce qu"ils font. [Алина, посмотри, что они делают.]
Княгиня подошла к двери, прошлась мимо нее с значительным, равнодушным видом и заглянула в гостиную. Пьер и Элен так же сидели и разговаривали.
– Всё то же, – отвечала она мужу.
Князь Василий нахмурился, сморщил рот на сторону, щеки его запрыгали с свойственным ему неприятным, грубым выражением; он, встряхнувшись, встал, закинул назад голову и решительными шагами, мимо дам, прошел в маленькую гостиную. Он скорыми шагами, радостно подошел к Пьеру. Лицо князя было так необыкновенно торжественно, что Пьер испуганно встал, увидав его.
– Слава Богу! – сказал он. – Жена мне всё сказала! – Он обнял одной рукой Пьера, другой – дочь. – Друг мой Леля! Я очень, очень рад. – Голос его задрожал. – Я любил твоего отца… и она будет тебе хорошая жена… Бог да благословит вас!…
Он обнял дочь, потом опять Пьера и поцеловал его дурно пахучим ртом. Слезы, действительно, омочили его щеки.
– Княгиня, иди же сюда, – прокричал он.
Княгиня вышла и заплакала тоже. Пожилая дама тоже утиралась платком. Пьера целовали, и он несколько раз целовал руку прекрасной Элен. Через несколько времени их опять оставили одних.
«Всё это так должно было быть и не могло быть иначе, – думал Пьер, – поэтому нечего спрашивать, хорошо ли это или дурно? Хорошо, потому что определенно, и нет прежнего мучительного сомнения». Пьер молча держал руку своей невесты и смотрел на ее поднимающуюся и опускающуюся прекрасную грудь.
– Элен! – сказал он вслух и остановился.
«Что то такое особенное говорят в этих случаях», думал он, но никак не мог вспомнить, что такое именно говорят в этих случаях. Он взглянул в ее лицо. Она придвинулась к нему ближе. Лицо ее зарумянилось.
– Ах, снимите эти… как эти… – она указывала на очки.
Пьер снял очки, и глаза его сверх той общей странности глаз людей, снявших очки, глаза его смотрели испуганно вопросительно. Он хотел нагнуться над ее рукой и поцеловать ее; но она быстрым и грубым движеньем головы пeрехватила его губы и свела их с своими. Лицо ее поразило Пьера своим изменившимся, неприятно растерянным выражением.
«Теперь уж поздно, всё кончено; да и я люблю ее», подумал Пьер.
– Je vous aime! [Я вас люблю!] – сказал он, вспомнив то, что нужно было говорить в этих случаях; но слова эти прозвучали так бедно, что ему стало стыдно за себя.
Через полтора месяца он был обвенчан и поселился, как говорили, счастливым обладателем красавицы жены и миллионов, в большом петербургском заново отделанном доме графов Безухих.

Старый князь Николай Андреич Болконский в декабре 1805 года получил письмо от князя Василия, извещавшего его о своем приезде вместе с сыном. («Я еду на ревизию, и, разумеется, мне 100 верст не крюк, чтобы посетить вас, многоуважаемый благодетель, – писал он, – и Анатоль мой провожает меня и едет в армию; и я надеюсь, что вы позволите ему лично выразить вам то глубокое уважение, которое он, подражая отцу, питает к вам».)
– Вот Мари и вывозить не нужно: женихи сами к нам едут, – неосторожно сказала маленькая княгиня, услыхав про это.
Князь Николай Андреич поморщился и ничего не сказал.
Через две недели после получения письма, вечером, приехали вперед люди князя Василья, а на другой день приехал и он сам с сыном.
Старик Болконский всегда был невысокого мнения о характере князя Василья, и тем более в последнее время, когда князь Василий в новые царствования при Павле и Александре далеко пошел в чинах и почестях. Теперь же, по намекам письма и маленькой княгини, он понял, в чем дело, и невысокое мнение о князе Василье перешло в душе князя Николая Андреича в чувство недоброжелательного презрения. Он постоянно фыркал, говоря про него. В тот день, как приехать князю Василью, князь Николай Андреич был особенно недоволен и не в духе. Оттого ли он был не в духе, что приезжал князь Василий, или оттого он был особенно недоволен приездом князя Василья, что был не в духе; но он был не в духе, и Тихон еще утром отсоветывал архитектору входить с докладом к князю.
– Слышите, как ходит, – сказал Тихон, обращая внимание архитектора на звуки шагов князя. – На всю пятку ступает – уж мы знаем…
Однако, как обыкновенно, в 9 м часу князь вышел гулять в своей бархатной шубке с собольим воротником и такой же шапке. Накануне выпал снег. Дорожка, по которой хаживал князь Николай Андреич к оранжерее, была расчищена, следы метлы виднелись на разметанном снегу, и лопата была воткнута в рыхлую насыпь снега, шедшую с обеих сторон дорожки. Князь прошел по оранжереям, по дворне и постройкам, нахмуренный и молчаливый.
– А проехать в санях можно? – спросил он провожавшего его до дома почтенного, похожего лицом и манерами на хозяина, управляющего.
– Глубок снег, ваше сиятельство. Я уже по прешпекту разметать велел.
Князь наклонил голову и подошел к крыльцу. «Слава тебе, Господи, – подумал управляющий, – пронеслась туча!»
– Проехать трудно было, ваше сиятельство, – прибавил управляющий. – Как слышно было, ваше сиятельство, что министр пожалует к вашему сиятельству?
Князь повернулся к управляющему и нахмуренными глазами уставился на него.
– Что? Министр? Какой министр? Кто велел? – заговорил он своим пронзительным, жестким голосом. – Для княжны, моей дочери, не расчистили, а для министра! У меня нет министров!
– Ваше сиятельство, я полагал…
– Ты полагал! – закричал князь, всё поспешнее и несвязнее выговаривая слова. – Ты полагал… Разбойники! прохвосты! Я тебя научу полагать, – и, подняв палку, он замахнулся ею на Алпатыча и ударил бы, ежели бы управляющий невольно не отклонился от удара. – Полагал! Прохвосты! – торопливо кричал он. Но, несмотря на то, что Алпатыч, сам испугавшийся своей дерзости – отклониться от удара, приблизился к князю, опустив перед ним покорно свою плешивую голову, или, может быть, именно от этого князь, продолжая кричать: «прохвосты! закидать дорогу!» не поднял другой раз палки и вбежал в комнаты.
Перед обедом княжна и m lle Bourienne, знавшие, что князь не в духе, стояли, ожидая его: m lle Bourienne с сияющим лицом, которое говорило: «Я ничего не знаю, я такая же, как и всегда», и княжна Марья – бледная, испуганная, с опущенными глазами. Тяжелее всего для княжны Марьи было то, что она знала, что в этих случаях надо поступать, как m lle Bourime, но не могла этого сделать. Ей казалось: «сделаю я так, как будто не замечаю, он подумает, что у меня нет к нему сочувствия; сделаю я так, что я сама скучна и не в духе, он скажет (как это и бывало), что я нос повесила», и т. п.
Князь взглянул на испуганное лицо дочери и фыркнул.
– Др… или дура!… – проговорил он.
«И той нет! уж и ей насплетничали», подумал он про маленькую княгиню, которой не было в столовой.
– А княгиня где? – спросил он. – Прячется?…
– Она не совсем здорова, – весело улыбаясь, сказала m llе Bourienne, – она не выйдет. Это так понятно в ее положении.
– Гм! гм! кх! кх! – проговорил князь и сел за стол.
Тарелка ему показалась не чиста; он указал на пятно и бросил ее. Тихон подхватил ее и передал буфетчику. Маленькая княгиня не была нездорова; но она до такой степени непреодолимо боялась князя, что, услыхав о том, как он не в духе, она решилась не выходить.
– Я боюсь за ребенка, – говорила она m lle Bourienne, – Бог знает, что может сделаться от испуга.
Вообще маленькая княгиня жила в Лысых Горах постоянно под чувством страха и антипатии к старому князю, которой она не сознавала, потому что страх так преобладал, что она не могла чувствовать ее. Со стороны князя была тоже антипатия, но она заглушалась презрением. Княгиня, обжившись в Лысых Горах, особенно полюбила m lle Bourienne, проводила с нею дни, просила ее ночевать с собой и с нею часто говорила о свекоре и судила его.

Архитектура MIPS была одной из первых RISC-архитектур, получившей признание со стороны промышленности. Она была анонсирована в 1986 году. Первоначально это была полностью 32-битовая архитектура, которая включала 32 регистра общего назначения длиною в 32 бит, 16 регистров плавающей точки и специальную пару регистров для хранения результатов выполнения операций целочисленного умножения и деления. Размер команд составлял 32 бит, в ней поддерживался всего один метод адресации, а адресное пространство также определялось 32 битами. Выполнение арифметических операций определялось стандартом IEEE 754. В компьютерной промышленности широкую популярность приобрели 32-битовые процессоры R2000 и R3000, которые в течение достаточно длительного времени служили основой для построения рабочих станций и серверов компаний Silicon Graphics, Digital, Siemens Nixdorf и др. Процессоры R3000/R3010 работали на тактовой частоте 33 или 40 МГц и обеспечивали производительность на уровне 20 SPECint92 и 23 SPECfp92.

На смену микропроцессорам семейства R3000 пришли новые 64-битовые микропроцессоры R4000 и R4400. (MIPS была первой в компьютерной промышленности компанией выпустившей процессоры с 64-битовой архитектурой). Набор команд этих процессоров (спецификация MIPS II) был расширен командами загрузки и записи 64-разрядных чисел с плавающей точкой, командами вычисления квадратного корня с одинарной и двойной точностью, командами условных прерываний, а также атомарными операциями, необходимыми для поддержки мультипроцессорных конфигураций. В процессорах R4000 и R4400 реализованы 64-битовые шины данных и 64-битовые регистры. В процессорах реализован метод удвоения внутренней тактовой частоты.

Процессоры R2000 и R3000 имели стандартные пятиступенчатые конвейеры команд. В процессорах R4000 и R4400 применяются более длинные конвейеры (иногда их называют суперконвейерами). Количество ступеней в процессорах R4000 и R4400 увеличилось до восьми, что объясняется прежде всего увеличением тактовой частоты и необходимостью распределения логики для обеспечения заданной пропускной способности конвейера. Процессор R4000 может работать с тактовой частотой 50/100 МГц и обеспечивает уровень производительности в 58 SPECint92 и 61 SPECfp92. Процессор R4400 может работать на частоте 50/100 МГц, или 75/150 МГц, показывая уровень производительности 94 SPECint92 и 105 SPECfp92.

Процессоры R4000 имели внутреннюю кэш-память емкостью 16 Кбайт, разделенную на 8-Кб кэш команд и 8-Кб кэш данных. С точки зрения реализации кэш-памяти процессор R4400 имеет более развитые возможности. Он выпускается в трех модификациях: PC (Primary Cash) - имеет внутренние кэши команд и данных емкостью по 16 Кбайт. Процессор в такой конфигурации предназначен главным образом для дешевых моделей рабочих станций. SC (Secondary Cash) содержит логику управления кэш-памятью второго уровня. MC (Multiprocessor Cash) - использует специальные алгоритмы обеспечения когерентности и согласованного состояния памяти для многопроцессорных конфигураций.

Компания MIPS объявила о создании своего нового суперскалярного процессора R10000, который в ближайшем будущем должен появиться на рынке. По заявлениям представителей MIPS Technology R10000 обеспечивает пиковую производительность в 800 MIPS при работе с внутренней тактовой частотой 200 МГц за счет обеспечения выдачи для выполнения четырех команд в одном такте синхронизации. При этом он обеспечивает обмен данными с кэш-памятью второго уровня со скоростью 3.2 Гбайт/с.

Чтобы обеспечить столь высокий уровень производительности в процессоре R10000 реализованы многие последние достижения в области технологии и архитектуры процессоров. На рис. 8.9 показана блок-схема этого микропроцессора.

Кэш-память данных первого уровня процессора R10000 имеет емкость 32 Кбайт и организована в виде двух одинаковых банков размером по 16 Кбайт, что обеспечивает двухкратное расслоение при выполнении обращений к этой кэш-памяти. Каждый банк представляет собой двухканальную множественно-ассоциативную кэш-память с размером строки (блока) в 32 байта. Кэш данных индексируется с помощью виртуального адреса и хранит теги физических адресов памяти. Такой метод индексации позволяет выбрать подмножество кэш-памяти в том же такте, в котором формируется виртуальный адрес. Однако для того, чтобы поддерживать когерентность с кэш-памятью второго уровня, в кэше первого уровня хранятся теги физических адресов памяти.

Интерфейс кэш-памяти второго уровня процессора R10000 поддерживает 128-битовую магистраль данных, которая может работать с тактовой частотой 200 МГц, обеспечивая скорость обмена 3.2 Гбайт/с. Все стандартные синхронные сигналы управления статической памятью вырабатываются внутри процессора. Минимальный объем кэш-памяти второго уровня составляет 512 Кбайт, максимальный размер - 16 Мбайт. Размер строки этой кэш-памяти программируется и может составлять 64 или 128 байт.

Объем внутренней двухканальной множественно-ассоциативной кэш-памяти команд составляет 32 Кбайт. Команды частично декодируются до их размещения в кэше команд. При этом к каждой команде добавляются 4 дополнительных бит, которые указывают исполнительное устройство, в котором она будет выполняться. Размер строки кэш-памяти команд составляет 64 байта.

Устройство переходов процессора может декодировать и выполнять одну команду перехода в каждом такте. Поскольку за каждой командой перехода следует слот задержки, максимально могут быть выбраны одновременно две команды перехода, но только одна более ранняя команда перехода может декодироваться в данный момент времени. Бит признака перехода добавляется к каждой команде во время декодирования команд. Эти биты используются для пометки команд перехода в конвейере выборки команд. Направление условного перехода прогнозируется с помощью специальной памяти, которая хранит историю выполнения переходов в прошлом. Двухбитовый код в этой памяти обновляется каждый раз, когда принято окончательное решение о направлении перехода. Все команды, выбранные вслед за командой условного перехода, считаются условными (спекулятивными). Это означает, что в момент их выборки заранее не известно, будет ли завершено их выполнение. Процессор допускает предварительное прогнозирование направления четырех команд условного перехода, которые могут разрешаться в произвольном порядке. Специальный стек переходов содержит строку на каждую выполняемую спекулятивно команду условного перехода. Каждая строка этого стека содержит информацию, необходимую для восстановления состояния процессора, если спекулятивные команды перехода были предсказаны неверно. Стек переходов позволяет быстро и эффективно восстановить конвейер, если прогноз направления перехода оказался неверным.

Рис. 8.9. Блок схема процессора R 10000

Процессор R10000 содержит три очереди (буфера) команд (очередь целочисленных команд, очередь команд плавающей точки и очередь адресных команд). Эти три очереди осуществляют выдачу команд в динамике в соответствующие исполнительные устройства. С каждой командой в очереди хранится тег команды, который перемещается вместе с командой по ступеням конвейера. Каждая очередь осуществляет динамическое планирование потока команд и может определить моменты времени, когда становятся доступными операнды, необходимые для каждой команды. Кроме того, очередь определяет порядок выполнения команд на основе анализа состояния соответствующих исполнительных устройств. Как только ресурс оказывается свободным очередь выдает команду в соответствующее исполнительное устройство.

Зависимости между командами могут привести к деградации производительности процессора. Чтобы этого избежать применяется специальная методика, которая называется методикой переименования регистров. Ее основная задача - определение зависимостей между командами и обеспечение точного адреса прерывания программы. В процессе переименования регистров каждый логический регистр, указанный в команде, заменяется физическим регистром на основе таблицы распределения регистров. Такое переименование происходит для каждого регистра результата команды. Поэтому, когда команда записывает в логический регистр новое значение, этот логический регистр переименовывается и будет использовать имя нового физического регистра. Однако, его предыдущее значение оказывается сохраненным в старом физическом регистре. Сохранение значений старого регистра позволяет обрабатывать точные прерывания. В то время как все команды переименовываются, логические номера их регистров сравниваются для определения зависимостей между четырьмя командами, декодированными в одном и том же такте.

В процессоре R10000 имеются пять полностью независимых исполнительных устройств: два целочисленных АЛУ, два основных устройства плавающей точки и два вторичных устройства плавающей точки, которые работают с длинными операциями, такими как деление и вычисление квадратного корня.

Устройство загрузки/записи содержит очередь адресов, устройство вычисления адреса, устройство преобразования виртуальных адресов в физические (TLB), стек адресов, буфер записи и кэш-память данных первого уровня. Устройство загрузки/записи выполняет команды загрузки, записи, предварительной выборки, а также команды работы с кэш-памятью.

Выполнение всех команд загрузки и записи начинается с трехтактной последовательности, во время которой осуществляется выдача команды, вычисление виртуального адреса и преобразование виртуального адреса в физический. Преобразование адреса осуществляется только однажды во время выполнения команды. Производится обращение к кэш-памяти данных и пересылка требуемых данных завершается при наличии данных в кэш-памяти первого уровня. В случае промаха, или в случае занятости требуемого разделяемого порта регистрового файла, обращение к кэшу данных и к тегу должно быть повторено после получения данных либо из кэш-памяти второго уровня, либо из основной памяти.

TLB содержит 64 строки и выполняет преобразование виртуального адреса в физический. Виртуальный адрес для преобразования поступает либо из устройства вычисления адреса, либо из счетчика команд.

Внешняя кэш-память второго уровня управляется с помощью внутреннего контроллера, который имеет специальный порт для подсоединения кэш-памяти. Специальная магистраль данных шириной в 128 бит осуществляет пересылки данных на тактовой частоте процессора 200 МГц. В процессоре имеется также 64-битовая шина данных системного интерфейса. Кэш-память второго уровня имеет двухканальную множественно-ассоциативную организацию. Максимальный размер - 16 Мбайт. Минимальный размер 512 Кбайт. Пересылки осуществляются 128-битовыми порциями (4 32-битовых слова). Для пересылки больших блоков данных используются последовательные циклы шины:

    Четырехсловные обращения (128 бит) используются для команд кэш-памяти;

    Восьмисловные обращения (256 бит) используются для перезагрузки первичного кэша данных;

    Шестнадцатисловные обращения (512 бит) используются для перезагрузки первичного кэша команд;

    Тридцатидвухсловные обращения (1024 бит) используются для перезагрузки кэш-памяти второго уровня.

Системный интерфейс процессора R10000 работает в качестве шлюза между самим процессором и связанным с ним кэшем второго уровня и остальной системой. Системный интерфейс работает с тактовой частотой внешней синхронизации. Возможно программирование работы системного интерфейса на тактовой частоте 200, 133, 100, 80, 67, 57 и 50 МГц.

Процессор поддерживает протокол расщепления транзакций, позволяющий осуществлять выдачу очередных запросов процессором или внешним абонентом шины, не дожидаясь ответа на предыдущий запрос. Максимально поддерживается до четырех одновременных транзакций на шине.

Процессор R10000 допускает два способа организации многопроцессорной системы. Один из способов связан с созданием специального внешнего интерфейса для каждого процессора системы. Этот интерфейс обычно реализуется с помощью заказной интегральной схемы, которая организует шлюз к основной памяти и подсистеме ввода/вывода. При таком типе соединений процессоры не связаны друг с другом непосредственно, а взаимодействуют через этот специальный интерфейс. Хотя такая реализация общепринята, ее стоимость достаточно высока.

Второй способ предназначен для достижения максимальной производительности при минимальных затратах. Он подразумевает использование от двух до четырех процессоров, объединенных шиной Claster Bus. В этом случае необходим только один внешний интерфейс для взаимодействия с другими ресурсами системы.

Как говорит Википедия , MIPS – микропроцессор, разработанный компанией MIPS Computer Systems (в настоящее время MIPS Technologies) и впервые реализованный 1985 году. Существует большое количество модификаций этой архитектуры, созданных специально для 3D-моделирования, быстрой обработки чисел с плавающей запятой, многопотоковых вычислений. Различные варианты этих процессоров использутся в роутерах Cisco и Mikrotik, смартфонах, планшетах и игровых консолях.

Инструкции MIPS достаточно просты для понимания, и именно с него рекомендуется начинать изучение ассемблера. Чем сейчас, собственно, и займёмся.

Структура программы на MIPS-ассемблере

Вот так выглядит классическая программа на MIPS-ассемблере.
Всё, что начинается на точку – это директивы . Директива.data означает начало сегмента данных, .text – начало сегмента кода.
Всё, после чего следует двоеточие, – это метки (v: , main: , loop: и endloop:).
Весь текст, следующий после знака # – это комментарии .
А то, что остаётся – это, собственно, инструкции и псевдоинструкции (макросы).

Data v: .word -1, -2, -3, -4, -5, -6, -7, -8, -9, -10 .text .globl main main: li $t0, 0 # $t0 = 0 (variable a) li $t1, 0 # $t1 = 0 (counter i) li $t2, 10 # $t2 = 10 (count limit l) loop: slt $t3, $t1, $t2 beq $t3, $zero, endloop la $t3, V sll $t4, $t1, 2 addu $t3, $t3, $t4 lw $t3, 0($t3) addu $t0, $t0, $t3 addiu $t1, $t1, 1 b loop endloop:

Типы в MIPS-ассемблере

Вот сравнительная таблица основных типов в C++ и в MIPS:


Как можно увидеть в таблице, выбор типа в для переменной в MIPS основывается только на объёме памяти, который будет занимать эта переменная. Обратите внимание, что MIPS в этом плане не различает signed- и unsigned-переменные.

Метки (символы)

В коде выше мы использовали несколько меток.
Метки (их ещё называют символами или этикетками) используются для того, чтоб давать «имена» адресам в памяти. Эти символы разделены на 2 больших класса: этикетки данных (адреса глобальных переменных, которые находятся в секции.data , в этом случае v:) и метки инструкций (адреса инструкций в секции.text , например main: , loop:).
Данные в секции.data обычно сохраняются в памяти начиная с адреса 0x10010000. Инструкции же хранятся начиная с адреса 0x00400000. Так как каждая инструкция MIPS-ассемблера занимает ровно 32 бита, следующая таблица «метка-адрес» будет верна для нашей программы:


С помощью меток очень удобно работать с глобальными переменными и другими данными из.data , но об этом чуть позже.

Основные директивы

Мы уже рассмотрели несколько директив, а именно.data и.text , и уже известно, что первая предназначена для хранения данных и объявления глобальных переменных, а вторая – собственно для кода программы. Посмотрим на остальные директивы MIPS:
  • .globl sym объявляет символ sym глобальным и позволяет обращатся к нему из других файлов;
  • .extern sym size объявляет, что данные, которые хранятся в sym имеют размер size , и делает sym глобальной меткой (см. предыдущую директиву);
  • .ascii str сохраняет строку str в памяти, не добавляя нулевой символ (\0) в конец;
  • .asciiz str сохраняет строку str и добавляет в конец нулевой символ (\0);
  • .byte b1, b2, ..., bn последовательно сохраняет в памяти байты b1, b2, ..., bn ;
  • .half h1, h2, ..., hn последовательно сохраняет в памяти 16-битные значения h1, h2, ..., hn ;
  • .word w1, w2, ..., wn последовательно сохраняет в памяти 32-битные значения w1, w2, ..., wn ;
  • .dword dw1, dw2, ..., dwn последовательно сохраняет в памяти 64-битные значения dw1, dw2, ..., dwn ;
  • .float f1, f2, ..., fn сохраняет в памяти числа с плавающей запятой f1, f2, ..., fn ;
  • .double d1, d2, ..., dn сохраняет в памяти числа с плавающей запятой (двойная точность) d1, d2, ..., dn ;
  • .space n выделить n байт в данном сегменте данных;
  • .align n выровнять все следующие данные до 2^n байт.
По поводу последней директивы: допустим, что в.data мы написали.align 1 . В таком случае даже если мы запишем в память, например в адрес 0x10010000 какое-то значение размером в 1 байт, следующий байт будет оставлен пустым, и если мы захотим записать ещё один байт в память, он уже получит адрес 0x10010002. В MIPS по умолчанию включено автоматическое выравнивание данных, и поэтому можно записать 16-битное значение (.half) только в чётный адрес памяти (0x10010000, 0x10010002, но не 0x10010003), 32-битное значение – только в адрес, кратный 4, а 64-битное – только в адрес, кратный 8.

Формат данных в.data

Данные в.data записываются в достаточно свободной манере. Нужно просто указать метку, тип данных и значение. В этом коде несколько примеров корректной записи данных:

Data var1: .byte "A", 0xF3, 127, -1, "\n" var2: .half -10, 0xffff var3: .word 0x12345678 var4: .float 12.3, -0.1 var5: .double 1.5e-10 var6: .dword 0x1234567812345678 str1: .ascii “i love mips\n" str2: .asciiz “zero-finished string" array: .space 100

Немного глубже мы рассмотрим типы данных по мере их использования в коде.

Регистры

Одна основных частей MIPS-процессора – это регистры. В стандартном MIPS-процессоре имеется 32 основных регистра и ещё 32 в первом сопроцессоре – модуле, который используется для вычислений с плавающей запятой. Каждый регистр имеет размер 32 бита, соответственно в него целиком помещается одно значение типа int . Для хранения переменной типа long необходимо использовать сразу два регистра. К каждому регистру можно обратиться по его порядковому названию и по его общему названию. Общее – немного более human-readable. Имеются следующие регистры:
  • $zero ($0) – регистр, всегда содержащий значение 0 и доступный только для чтения;
  • $at ($1) – временный регистр процессора;
  • $v0-$v1 ($2-$3) – для результатов, возвращаемых функциями;
  • $a0-$a3 ($4-$7) – для аргументов функций;
  • $t0-$t9 ($8-$15, $24-$25) – для временных данных, можно использовать как угодно;
  • $s0-$s8 ($16-$23, $30) – для постоянных данных, можно использовать как угодно;
  • $k0-$k1 ($26-$27) – зарезервировано для ядра операционной системы;
  • $gp ($28) – поинтер для глобальных переменных, практически не используется;
  • $sp ($29) – поинтер стека, его значение всегда равно верхнему адресу стека;
  • $ra ($31) – бог солнца адрес инструкции, из которой была вызвана функция;
  • $f0 – для результатов, возвращаемых функцями, с плавающей запятой;
  • $f4, $f6, $f8, $f10, $f16, $f18 – для временных данных с плавающей запятой;
  • $f12, $f14 – для параметров функций с плавающей запятой

Инструкции MIPS

Примечание. C этого момента мы будем рассматривать MIPS-процессор, его инструкции и дополнения на примере замечательного симулятора MIPS под названием MARS , который можно загрузить отсюда . Имплементация MIPS в этом симуляторе полностью соответствует стандартам.

В коде в начале статьи мы уже выделили все функциональные части программы и определили инструкции и псевдоинструкции как то, что не является комментарием, символом (меткой) или директивой. Псевдоинструкции также называют макросами, они трансформируются в одну или несколько инструкций во время выполнения кода. Вот пример макроса:

La rdest, addr переходит в набор инструкций:

Lui $at, hi(addr) ori rdest, $at, lo(addr)

Как видно, MIPS-программы всегда записываются по одной инструкции на строчку.

Типы инструкций

Существует три основных типа инструкций MIPS-ассемблера:
  • тип R (register). В роли операндов используются три регистра – регистр назначения (сокр. $rd), первый аргумент ($rs), и второй аргумент ($rt). Пример такой инструкции – сложение трёх регистров: add $t2, $t0, $t1 В данном случае в $t2 будет помещён результат сложения значений в $t0 и $t1.
  • тип I (immediate). Операнды – два регистра и число. Пример инструкции типа I: addi $t3, $t2, 12 После выполнения в регистр $t3 будет помещён результат сложения $t2 и числа 12.
  • Тип J (jump). Единственный операнд – 26-битный адрес, куда нужно перейти. Инструкция j 128 перейдёт на адрес 128 в.text .

Также существуют инструкции для сопроцессоров, но их мы рассмотрим позже.

Инструкция syscall

syscall – одна из самых простых, но в то же время одна из самых значимых инструкций MIPS-ассемблера. Это – служебная инструкция, поэтому она рассматривается отдельно от остальных. syscall используется для обращения к операционной системе для произведения действий, которые процессор сам не в состоянии выполнить. Перед вызовом этой инструкции нужно положить в регистр $v0 служебный код – натуральное число от 1 до 12. В зависимости от кода операционная система будет производить одно или другое действие. Вот список служебных кодов и соответствующие им действия операционной системы, которые поддрерживает MARS:

Весь ввод и вывод происходит через консоль MARS"a.

Арифметические инструкции

Итак, рассмотрим некоторые основные арифметические инструкции. Будут использованы некоторые сокращения: rd – регистр, куда пишется результат, rs – первый аргумент, rt – второй аргумент. Также может встретиться imm16 – 16-битное целое число или imm5 – 5-битное натуральное число.
  • add rd, rs, rt сумма rs и rt записывается в регистр rd. Аккуратно, может вызвать переполнение.
  • sub rd, rs, rt rd = rs - rt. Также можно получить переполнение.
  • addu rd, rs, rt почти то же самое, что и предыдущая инструкция, но эта не может вызвать переполнение. Для арифметических вычислений предпочтительно использовать именно эту инструкцию.
  • subu rd, rs, rt rd = rs - rt. Также без переполнения, и поэтому рекомендуется к использованию.
  • addi rd, rs, imm16 rt = rs + 16-битное целое число. Как и add , может вызывать переполнение.
  • addiu rd, rs, imm16 то же самое, но без возможности переполнения. Use it.

Кстати, imm16 по умолчанию интерпретируются как позитивные. Например:
addiu $s1, $zero, 0xFFFF # $s1 = 0x0000FFFF (положительное значение)
Если нужно добавить отрицательное значение, то нужно явно это указать:
addiu $s1, $zero, -0xFFFF # $s1 = 0xFFFF0001 (негативное значение в дополнении к 2)

Давайте посмотрим на реальные вычисления с помощью этих инструкций. Возьмём, к примеру, следующий код (на C++):
int f = (g+h) - (i-j);
И переведём этот код в MIPS-инструкции. Сначала нужно вычислить значение справа от знака "=", а потом присвоить его переменной f. Допустим, что переменная f у нас будет находиться в регистре $s0, g – в $s1, h – в $s2, i – в $s3, а j – в $s4. Вот что получается:

Addu $t0, $s1, $s2 # t0 = s1 + s2 = g + h subu $t1, $s3, $s4 # t1 = s3 - s4 = i - j subu $s0, $t0, $t1 # s0 = f = t0 - t1 = (g+h) - (i-j)

А теперь можно протестировать получившийся код в MARS. Загрузите черновик вот

MIPS
Разработчик MIPS Technologies, Inc.
Разрядность 64-bit (32→64)
Представлена 1981
Архитектура RISC
Тип Регистр-регистр
Кодирование СК фиксированное
Переходы по сравнению двух регистров
Порядок байтов Bi-endian (big→bi)
Расширения MDMX, MIPS-3D, MIPS16e, MIPS MT
Регистры
Общего назначения 31 (R0=0)
Вещественные 32 (для double используются пары регистров в 32-битных версиях процессора)

В настоящее время различные реализации MIPS используются в основном во встроенных системах, например, в смартфонах , маршрутизаторах , шлюзах , а также в игровых консолях, таких, как Sony PlayStation 2 и Sony PlayStation Portable. До конца 2006 года они применялись и в компьютерах SGI . К концу 1980-х и 1990-х эта архитектура широко использовалась многими компаниями, среди них Digital Equipment Corporation , NEC , Pyramid Technology, Siemens Nixdorf и Tandem Computers . С середины до конца 1990-х годов каждым третьим микропроцессором на рынке был процессор под управлением MIPS.

История

Основоположник RISC

В 1981 году коллектив под руководством Джона Хеннесси (John L. Hennessy) из Университета Стэнфорда начал работу над проектом, который получил название MIPS. Главной идеей было увеличить производительность процессора, используя удлиненный конвейер . Концепция применения конвейера в качестве основной технологии была известна ещё задолго до этого (например, в IBM 801), но она не использовала весь свой потенциал. Центральный процессор включает в себя несколько специальных субблоков, таких, как декодеры команд, целочисленное АЛУ (арифметико-логическое устройство), блоки загрузки/хранения (работа с памятью) и т. д. В традиционной не оптимизированной реализации отдельная команда в программе должна быть (почти всегда) завершена, прежде, чем запустится другая; в то время как в конвейерной архитектуре последовательные команды могут выполняться параллельно. Например, когда математическая инструкция вносится в блок с плавающей запятой, блок загрузки/хранения памяти может в этот же момент вызвать следующую команду.

Одним из главных препятствий в использовании конвейера был тот факт, что некоторые команды, такие, как деление, выполняются намного дольше, и, вследствие этого, центральному процессору приходится ждать, прежде, чем передать на конвейер следующую команду. Единственное решение этой проблемы - использовать серию блокировок, позволяющих определенным стадиям конвейера индицировать, что они заняты и, в этом случае, приостанавливать вышестоящие в потоке команды. Группа Хеннеси рассматривала эти блокировки как огромный барьер в увеличении производительности, поскольку было необходимо обращаться ко всем модулям Центрального процессора, что занимает лишнее время и ограничивает тактовую частоту. Главным аспектом устройства MIPS было согласовать каждую подфазу каждой команды, в том числе кэширование, в один цикл, таким образом избегая необходимости в блокировках и пропуская на конвейер только один цикл.

Хотя такая реализация и исключала бы некоторые очень полезные операции, такие, как умножение и деление, очевидно, что предельная производительность системы значительно увеличилась бы, так как микросхемы смогли бы работать с более высокой тактовой частотой. Достижение высокой скорости с использованием блокировок было бы затруднительным, так как время, требуемое для установки блокировок, пропорционально тактовой частоте, в свою очередь, зависящей от размера кристалла. Вот почему исключение вышеупомянутых операций стало спорным вопросом.

Другое отличие архитектуры MIPS от конкурирующих с ним Berkeley-архитектур - внедренная в Berkeley-RISC возможность обработки вызова подпрограмм. Чтобы увеличить производительность столь общей задачи, в Berkeley-RISC была использована технология, называемая регистровым окном , которая, тем не менее, ограничивала максимальную глубину многоуровневых вызовов. Каждый вызов подпрограммы требовал свой набор регистров, что делало необходимым увеличение их количества. Тогда как аппаратная реализация данного механизма занимала дополнительное пространство в кристалле ЦП. Но Хеннесси полагал, что более «тщательный» компилятор мог бы найти свободные регистры для передачи параметров функции, и что всего лишь увеличение числа регистров могло бы не только упростить эту задачу, но и увеличить производительность всех операций. Поэтому было принято решение отказаться от данной технологии в MIPS.

Архитектура MIPS была, в некотором отношении, наиболее типичной для RISC . Чтобы сэкономить биты в коде команды, в RISC было уменьшено количество инструкций для кодирования. В MIPS из 32 битов слова всего 6 используются для основного кода, а остальные могут содержать либо единственный 26-битный адрес перехода, либо до 5 полей, устанавливающих от 1 до 3 регистров + длина сдвига регистра. Существует и ряд других форматов, например, когда 2 регистра задаются непосредственно выделенным 16-битным полем и т. д. Такое распределение позволило процессору загружать команду и необходимые ей данные за один машинный такт, в то время как в более старых архитектурах (не являвшихся RISC), например, таких, как MOS Technology 6502, требовались отдельные такты для загрузки основного кода и данных.

Это было одним из главных усовершенствований, наращивающих производительность, предлагаемых RISC. Однако следует заметить, что неRISC-архитектуры все же достигли подобной скорости, но другими средствами (такими, как очереди в ЦП).

Первая аппаратная реализация

В 1984 году, убежденный в коммерческом спросе на свою разработку, Хеннесси покинул Стэнфорд и основал компанию MIPS Computer Systems. В 1985 году вышла первая коммерческая реализация микропроцессора MIPS - R2000 , доработанная в 1988 году и получившая название R3000 . Эти 32-битные процессоры легли в основу продуктовой линейки компании в 1980-х и использовались преимущественно в SG-сериях рабочих станций. Новые коммерческие проекты не соответствовали Стэнфордским научным исследованиям, так как практически все блокировки выполнялись на аппаратном уровне, к тому же операции умножения и деления были полностью реализованы.

В 1991 году впервые был представлен как 64-битный микропроцессор MIPS - модель R4000. R4000 имеет расширенный TLB , в котором запись содержит не только виртуальный адрес, но и виртуальный идентификатор адресного пространства. Такой буфер устраняет основные проблемы производительности микроядра, достаточно медлительного в конкурирующих архитектурах (Pentium , PowerPC , Alpha) из-за необходимости сбрасывать TLB во время частого переключения контекста.

Тем не менее, у MIPS возникали финансовые трудности в связи с поставкой процессоров на рынок. Проект был настолько важен для SGI (в то время являвшихся одними из немногих основных покупателей MIPS), что в 1992 году SGI выкупили права на компанию с условием гарантии, что конструкция микропроцессоров не изменится. Став дочерней компанией, MIPS Computer Systems получили название MIPS Technologies .

Лицензируемая архитектура

В начале 1990 года MIPS начали лицензирование своих разработок для сторонних производителей. Идее сопутствовала удача из-за простоты ядра, которое находило множество применений, где ранее использовались намного менее эффективные CISC -архитектуры, с тем же количеством и той же ценой схем (2 этих критерия тесно связаны: цена ЦП, как правило, зависит от количества схем и контактов). Компания Sun Microsystems сделала аналогичную попытку лицензировать SPARC -ядра, но Sun подобная удача не сопутствовала. К концу 1990-х MIPS стали наиболее важной компанией в производстве встроенных процессоров, и в 1997 году 48-миллионные поставки процессоров на MIPS-ядрах позволили RISC-архитектурам вытеснить популярное семейство процессоров 68k. MIPS были настолько популярны, что в 1998 году SGI передали часть активов MIPS Technologies . На сегодняшний день половину доходов MIPS дает лицензирование разработок, а большую часть другой половины - контракты на разработку ядер для производства сторонними производителями.

В 1999 году MIPS формализовали свои системы лицензирования вокруг двух основных конструкций - 32-разрядной MIPS32 (на базе MIPS II с некоторыми дополнительными функциями MIPS III, IV MIPS и MIPS V) и 64-разрядных MIPS64 (на базе MIPS V). Лицензия на MIPS64 была приобретена каждой из компаний NEC , Toshiba и SiByte (впоследствии приобретенная Broadcom) сразу же после объявления о её выпуске. Вскоре к ним присоединились Philips , LSI Logic и IDT. Успех следовал за успехом, и сегодня процессоры MIPS являются одним из наиболее востребованных товаров на рынке устройств компьютерного типа (карманных компьютеров, приставок и т. п.), наряду с другими разработчиками, тщетно пытающимися их вытеснить.

Через несколько лет после того, как MIPS-архитектура стала лицензируемой, она начала привлекать все больше и больше новых компаний по разработке процессоров. Первой такой компанией была Quantum Effect Devices (см. следующий раздел). Команда разработчиков, собравших MIPS R4300i , основала компанию SandCraft, предоставившую компании NEC новый процессор R5432 , а немного позднее смоделировавшую R71000 - один из первых нестандартных процессоров для рынка встраиваемых систем. Команда основателей компании DEC StrongARM, в конце концов, разделилась на две новых компании по разработке процессоров, в основу которых лег MIPS: SiByte, производившая SB-1250 - одну из первых чиповых систем с высокой производительностью, основанных на MIPS (SOC) и Alchemy Semiconductor (позднее приобретенная AMD), производившая Au-1000 SOC для маломощных приложений. Компания Lexra использовала архитектуру, подобную MIPS, добавив к ней DSP для рынка аудиомикросхем, а также поддержку многопотокового режима для сетевого рынка. Так как Lexra не покупала лицензию на MIPS, вскоре между двумя компаниями разгорелись судебные процессы. Первый был довольно быстро погашен уже после того, как Lexra пообещала не продвигать свои процессоры, как сходные с MIPS. Второй процесс (о патенте MIPS 4814976 на обработку невыровненной инструкции (unaligned) доступа к памяти) был более затяжным и негативно отразился на бизнесе обеих компаний, а по его завершении MIPS Technologies выдали Lexra бесплатную лицензию и выплатили денежную компенсацию в крупном размере.

Следом за этими событиями на рынке появились две компании, специализирующиеся на создании многоядерных устройств, использующих архитектуру MIPS. Корпорация Raza Microelectronics выкупили производственную линию у менее успешных SandCraft, а затем начала выпускать восьмиядерные устройства для рынка телекоммуникаций и сетей. Cavium Networks, изначально являвшиеся поставщиком средств защиты процессоров, тоже начали производство восьми-, а позже и 32-ядерных архитектур для тех же рынков. Обе компании сами проектировали ядра, и лишь лицензировали разработки вместо того, чтобы покупать готовые проекты процессоров MIPS.

Потеря рынка ПК

Среди производителей, создавших рабочие станции с использованием микропроцессоров MIPS, - такие компании, как SGI , MIPS Computer Systems, Inc., Whitechapel Workstations, Olivetti, Siemens-Nixdorf, Acer, Digital Equipment Corporation, NEC, и DeskStation. В числе операционных систем, портированных на архитектуру MIPS: IRIX компании SGI, Windows NT (до версии 4.0) компании Microsoft , Windows CE , Linux , UNIX (System V и BSD), SINIX, QNX , и операционная система RISC OS, непосредственно принадлежащая компании MIPS Computer Systems.

В начале 1990-х существовало предположение, что MIPS вместе с другими мощными процессорами RISC вскоре обгонят архитектуру IA32 компании Intel . Этому способствовала поддержка двух первых версий Windows NT для Alpha , MIPS и PowerPC компании Microsoft , и, в несколько меньшей степени, - архитектуры Clipper и SPARC. Однако, как только Intel выпустил новейшие версии ЦП семейства Pentium , Microsoft Windows NT v4.0 перестал поддерживать все, кроме Alpha и Intel. После решения SGI перейти на архитектуры Itanium и IA32 процессоры MIPS практически полностью перестали использоваться в персональных компьютерах.

Рынок встраиваемых систем

В 1990-е годы MIPS -архитектура была широко распространена на рынке встраиваемых систем : для сетей, телекоммуникаций, видеоигр, игровых консолей, принтеров, цифровых приставок, цифровых телевизоров, xDSL и кабельных модемов, а также карманных компьютеров.

Низкое энергопотребление и температурные характеристики встраиваемых MIPS-архитектур, широкие возможности внутренних функций делают этот микропроцессор универсальным для многих устройств.

Синтезируемые ядра для рынка встраиваемых систем

В последние годы большинство технологий, используемых в различных поколениях MIPS , предложены в виде IP-ядер (стандартных блоков) для встраиваемых реализаций процессора. Более того, предложены оба типа ядер - основанные на 32 и 64 битах, известные как 4K и 6K . Такие ядра могут совмещаться с другими структурными элементами, такими, как FPU , системами SIMD , различными устройствами ввода-вывода и т. д.

Некогда коммерчески успешные ядра MIPS и в настоящее время нашли потребительское и промышленное применение. Эти ядра можно найти в новых маршрутизаторах Cisco , Linksys , ZyXEL и MikroTik , кабельных и ADSL -модемах, смарт-картах , механизмах лазерных принтеров, цифровых приставках, роботах, карманных компьютерах, Sony PlayStation 2 и Sony PlayStation Portable. Тем не менее, в приложениях мобильных телефонов и PDA MIPS не удалось сместить прочно установившуюся там конкурирующую ARM -архитектуру.

Процессоры под управлением MIPS включают в себя: IDT RC32438; ATI Xilleon; Alchemy Au1000, 1100, 1200 ; Broadcom Sentry5; RMI XLR7xx, Cavium Octeon CN30xx, CN31xx, CN36xx, CN38xx and CN5xxx; Infineon Technologies EasyPort, Amazon, Danube, ADM5120, WildPass, INCA-IP, INCA-IP2; Microchip Technology PIC32 ; NEC EMMA and EMMA2, NEC VR4181A, VR4121, VR4122, VR4181A, VR5432, VR5500; Oak Technologies Generation; PMC-Sierra RM11200; QuickLogic QuickMIPS ESP; Toshiba Donau, Toshiba TMPR492x, TX4925, TX9956, TX7901; KOMDIV-32 , KOMDIV-64 ?! ; Мультикор .

Суперкомпьютеры MIPS

Одним из наиболее интересных применений архитектуры MIPS является их использование в многопроцессорных вычислительных суперкомпьютерах. В начале 1990-х компания Silicon Graphics (SGI) перенаправила свой бизнес с графических терминалов на рынок высокопроизводительного вычисления. Успех первых попыток компании в области серверных систем (а именно, серия Challenge, основанная на R4400, R8000 и R10000) мотивировал SGI создать гораздо более мощную систему. Использование R10000 позволило компании спроектировать систему Origin 2000, в конечном счете расширяемую до 1024 ЦП, используя собственную межсистемную связь cc-NUMA (NUMAlink). Позже Origin 2000 породила новую систему - Origin 3000 , вышедшую с теми же максимальными 1024 ЦП, но использовавшую в разработке микросхемы R14000 и R16000 с частотой до 700 МГц. Однако, в 2005 году, когда SGI приняла стратегическое решение о переходе на архитектуру Intel IA-64, суперкомпьютеры, базированные на MIPS, были сняты с производства.

В 2007 году корпорация SiCortex представила новый многопроцессорный персональный суперкомпьютер, основанный на архитектуре MIPS. В его разработку легли MIPS64 и высокопроизводительная межсистемная связь с использованием топологии графов Кауца (англ. Kautz graph ). Данная система является предельно эффективной и вычислительно мощной. Её уникальный аспект - многоядерный узел обработки, интегрирующий шесть ядер MIPS64, коммутатор контроллера памяти, межсистемную связь механизмов прямого доступа к памяти, локальную сеть с пропускной способностью 1 Гбит и PCI Express контроллеры. И все это на одном кристалле, который потребляет 10 Вт энергии, но выполняет максимум 6 миллиардов операций с плавающей запятой в секунду. Самая мощная конфигурация такого суперкомпьютера - версия SC5832, состоящая из 972 узлов (всего 5832 ядер MIPS64) и выполняющая 8,2 триллионов операций с плавающей запятой в секунду.

Loongson возвращает к персонализации

Серия R4000 , выпущенная в 1991 году, расширила процессоры MIPS до 64 битов. (MIPS Technology была первой компанией, выпустившей процессоры с 64-битовой архитектурой) R4000 состоит из 1,3 млн транзисторов, имеет встроенный кэш данных и кэш инструкций (оба по 8 Кб). В этом процессоре внешняя тактовая частота 50 МГц удваивается, а внутренняя тактовая частота составляет 100 МГц. Процессор R4400 выполнен на основе R4000, состоит из 2,2 млн транзисторов, имеет встроенный кэш данных и кэш инструкций (оба по 16 Кб), а внутренняя тактовая частота составляет 150 МГц. Набор команд этих процессоров (спецификация MIPS II) был расширен командами загрузки и записи 64-разрядных чисел с плавающей запятой, командами вычисления квадратного корня с одинарной и двойной точностью, командами условных прерываний, а также атомарными операциями, необходимыми для поддержки мультипроцессорных конфигураций. В процессорах R4000 и R4400 реализованы 64-битовые шины данных и 64-битовые регистры.

MIPS, теперь являющийся отделом SGI под названием MTI , разработал недорогие процессоры R4200, послужившие основой для будущих (ещё более дешёвых) R4300i. Производная этого процессора, NEC VR4300, использовалась в игровых консолях Nintendo 64 .

Quantum Effect Devices (QED), самостоятельная компания, основанная разработчиками MIPS, разработала серию процессоров R4600 Orion, R4700 Orion, R4650 и R5000. Если в R4000 увеличили тактовую частоту, но пожертвовали количеством кэш-памяти, то QED уделили большое внимание и ёмкости кэш-памяти (доступ к которой можно получить всего за 2 цикла), и эффективному использованию поверхности кристалла. Процессоры R4600 и R4700 использовались в недорогих версиях рабочей станции SGI Indy, а также в первых маршрутизаторах Cisco (основанных на MIPS), например, серии 36х0 и 7х00. Микропроцессор R4650 применялся в телевизионных приставках WebTV (в настоящее время - Microsoft TV). В процессоре R5000 FPU диспетчеризация операций с плавающей запятой (одинарной точности) была более гибкой, чем в R4000, и, вследствие этого, рабочие станции SGI Indys, базированные на R5000 отличались лучшей графической производительностью, чем R4400 с такой же тактовой скоростью и графическим аппаратным устройством. Чтобы подчеркнуть улучшение после объединения R5000 и старой графической платы, SGI дала ей новое название. Немного позднее QED разработали семейство процессоров RM7000 и RM9000 для рынка сетей и лазерных принтеров. В Августе 2000 года компания QED была приобретена производителем полупроводников PMC-Sierra, и последняя продолжила инвестирование MIPS-архитектур. Процессор RM7000 включал в себя 256 Кб встроенной кэш-памяти 2го уровня и контроллер для дополнительной кэш-памяти 3го уровня. Были созданы процессоры RM9xx0 - семейство SOC-устройств, в которые включены такие периферийные составляющие (на северном мосту), как: контроллер памяти, PCI-контроллер, контроллер Ethernet, а также быстрые устройства ввода-вывода (например, высокопроизводительная шина типа HyperTransport).

R8000 (представлен в 1994 году) был первой суперскалярной архитектурой MIPS, способной осуществлять 2 целочисленные инструкции (или с плавающей запятой) и 2 инструкции обращения к памяти за один цикл. Данная разработка использовала 6 схем: устройство для целочисленных команд (16 Кб - команды и 16 Кб - кэш данных), для команд с плавающей запятой, три вторичных дескриптора кэш-памяти ОЗУ (два для вторичного доступа к кэш-памяти + один для отслеживания шины), а также кэш-контроллер ASIC. Архитектура имеет два полностью конвейеризованных устройства умножения-сложения (с двойной точностью), которые могут передавать поток данных в 4 Мб внекристального вторичного кэша. В середине 1990-х процессоры R8000 запустили SGI серверы POWER Challenge, а позже стали доступны на рабочих станциях POWER Indigo2. Хотя производительность этого FPU и была наиболее подходящей для научных сотрудников, ограниченность его целочисленной производительности и высокая цена не смогли привлечь большинство пользователей, поэтому R8000 был на рынке всего год, и даже сейчас его едва ли можно найти.

В 1995 году был выпущен R10000 . Этот процессор в однокристальном исполнении, работал с более высокой тактовой частотой, чем R8000, а также включал в себя объемную (32 КБ) первичную кэш-память данных и команд. Кроме того, он был суперскалярным, но это главное новшество было неисправно. Но даже с более простым FPU, значительно увеличенная производительность целочисленный вычислений, более низкая цена и высокая плотность записи сделали R10000 предпочтительным для большинства пользователей.

Все более поздние проекты были основаны на ядре R10000 . В R12000 был использован 0.25 микронный технологический процесс с целью уменьшить чип и достигнуть большей тактовой скорости. Исправленный R14000 имел более высокую тактовую частоту в дополнение с поддержкой DDR SRAM для внекристальной кэш-памяти. Следом были выпущены R16000 и R16000A, тактовая частота которых была также увеличена; в них была встроена дополнительная кэш-память первого уровня, а их производство требовало более мелких кристаллов, чем прежде.

Среди других представителей семейства MIPS - R6000 , ЭСЛ-реализация, выполненная компанией Bipolar Integrated Technology . R6000 относится к поколению процессоров MIPS II. Его TLB и устройство кэш-памяти значительно отличаются от остальных представителей данного семейства. R6000 не принес обещанной выгоды, и, хотя был признан в некоторой степени полезным для компьютеров Control Data, он мгновенно исчез с основного рынка.

Микропроцессоры MIPS
Модель Частота (МГц) Год Технология разработки (µm) Транзисторы (млн.) Размер кристалла (мм²) Число выводов Мощность (Вт) Напряжение (В) Кэш данных (KБ) Кэш инструкций (KБ) Кэш 2го уровня Кэш 3го уровня
R2000 8-16.67 1985 2.0 0.11 ? ? ? ? 32 64 НЕТ НЕТ
R3000 12-40 1988 1.2 0.11 66.12 145 4 ? 64 64 0-256 Kб Внешняя НЕТ
R4000 100 1991 0.8 1.35 213 179 15 5 8 8 1 Mб Внешняя НЕТ
R4400 100-250 1992 0.6 2.3 186 179 15 5 16 16 1-4 Mб Внешняя НЕТ
R4600 100-133 1994 0.64 2.2 77 179 4.6 5 16 16 512 Kб Внешняя НЕТ
R4700 133 1996 ? ? ? 179 ? ? 16 16 Внешняя НЕТ
R5000 150-200 1996 0.35 3.7 84 223 10 3.3 32 32 1 Mб Внешняя НЕТ
R8000 75-90 1994 0.7 2.6 299 591+591 30 3.3 16 16 4 Mб Внешняя НЕТ
R10000 150-250 1996 0.35, 0.25 6.7 299 599 30 3.3 32 32 512 Kб-16 Mб Внешняя НЕТ
R12000 270-400 1998 0.25, 0.18 6.9 204 600 20 4 32 32 512 Kб-16 Mб Внешняя НЕТ
RM7000 250-600 1998 0.25, 0.18, 0.13 18 91 304 10, 6, 3 3.3, 2.5, 1.5 16 16 256 Kб Внутренняя 1 Mб Внешняя
R14000 500-600 2001 0.13 7.2 204 527 17 ? 32 32 512 Kб-16 Mб Внешняя НЕТ
R16000 700-1000 2002 0.11 ? ? ? 20 ? 64 64 512 Kб-16 Mб Внешняя НЕТ
R24K 750+ 2003 65 nm ? 0.83 ? ? ? 64 64 4-16 Mб Внешняя НЕТ

Формат инструкций MIPS I

Инструкции делятся на три типа: R, I и J. Каждая инструкция начинается с 6-битного кода. В дополнение к коду, инструкции R-типа определяют три регистра, область размера сдвига регистра, и область функции; инструкции I-типа определяют два регистра и непосредственное значение; инструкции J-типа состоят из кода операции и 26-битного адреса перехода.

Тип −31− формат (в битах) −0−
R код (6) rs (5) rt (5) rd (5) shamt (5) функция (6)
I код (6) rs (5) rt (5) непосредственное (16)
J код (6) адрес (26)

Язык ассемблера MIPS

Данные инструкции языка ассемблера имеют прямую аппаратную реализацию, в отличие от псевдоинструкций, которые перед сборкой транслируются в настоящие составные инструкции.

  • Далее регистровые буквы d, t, и s будут обозначать указатели на номера и имена регистров.
  • C обозначает константу.
  • Все последующие команды являются собственными.
  • Все коды операций и функций представлены в шестнадцатеричной системе счисления.
  • Руководство "Набор инструкций MIPS32" предупреждает, что слово "беззнаковый (unsigned)", используемое в описании инструкций сложения и вычитания является вводящим в заблуждение. Разница между знаковыми и беззнаковыми такими инструкциями заключается лишь в генерации исключения при обнаружении переполнения (в случае команд "со знаком"), или же игнорирование переполнения для "беззнаковых" (переполнением, как понятно, здесь считается именно переполнение для чисел со знаком). Операнд константа, в соответствии с этими инструкциями, всегда должен иметь знак.

Целочисленные операции

MIPS имеет 32 регистра для целочисленных операций. Для выполнения арифметических вычислений данные должны находиться в регистрах. Регистр $0 всегда хранит 0, а регистр $1 резервируется для сборки (для хранения псевдоинструкций и больших констант). Нижеприведенная таблица показывает, какие биты каким частям инструкции соответствуют. Дефис (-) обозначает нейтральное состояние.

Категория Название Синтаксис инструкции Значение Формат/код/функция Примечания/Кодирование
Арифметическая Add add $d,$s,$t $d = $s + $t R 0 20 16 Складывает два регистра, выполняет прерывание при переполнении
000000ss sssttttt ddddd--- --100000
Add unsigned addu $d,$s,$t $d = $s + $t R 0 21 16
000000ss sssttttt ddddd--- --100001
Subtract sub $d,$s,$t $d = $s − $t R 0 22 16 Вычитает два регистра, выполняет прерывание при переполнении
000000ss sssttttt ddddd--- --100010
Subtract unsigned subu $d,$s,$t $d = $s − $t R 0 23 16 Как и выше, но игнорирует переполнение
000000ss sssttttt ddddd000 00100011
Add immediate addi $t,$s,C $t = $s + C (знаковое) I 8 16 - Используется для сложения констант со знаками (а также для копирования одного регистра в другой: addi $1, $2, 0), выполняет прерывание при переполнении
001000ss sssttttt CCCCCCCC CCCCCCCC
Add immediate unsigned addiu $t,$s,C $t = $s + C (знаковое) I 9 16 - как и выше, но игнорирует переполнение, С остается знаковым
001001ss sssttttt CCCCCCCC CCCCCCCC
Multiply mult $s,$t LO = (($s * $t) << 32) >> 32;
HI = ($s * $t) >> 32;
R 0 18 16 Умножает два регистра и записывает 64-битный результат в два специальных поля для памяти - LO and HI. Аналогично можно записать результат операции в виде: (int HI,int LO) = (64-bit) $s * $t. См. mfhi и mflo для доступа к LO и HI регистрам.
Divide div $s, $t LO = $s / $t HI = $s % $t R 0 1A 16 Делит один регистр на другой и записывает 32-битный результат в LO, а остаток в HI .
Divide unsigned divu $s, $t LO = $s / $t HI = $s % $t R 0 1B 16 Делит один регистр на другой и записывает 32-битный результат в LO, а остаток - в HI.
Передача данных Load double word ld $t,C($s) $t = Memory[$s + C] I 23 16 - загружает double word из: MEM[$s+C] и следующих 7 байтов в $t и следующий регистр.
Load word lw $t,C($s) $t = Memory[$s + C] I 23 16 - загружает word из: MEM[$s+C] и следующих 3 байтов.
Load halfword lh $t,C($s) $t = Memory[$s + C] (знаковое) I 21 16 - загружает halfword из: MEM[$s+C] и следующего байта. Знак расширен до ширины регистра.
Load halfword unsigned lhu $t,C($s) $t = Memory[$s + C] (беззнаковое) I 25 16 -
Load byte lb $t,C($s) $t = Memory[$s + C] (signed) I 20 16 - загружает byte из: MEM[$s+C].
Load byte unsigned lbu $t,C($s) $t = Memory[$s + C] (unsigned) I 24 16 - Как и выше, но без расширения знака.
Store double word sd $t,C($s) Memory[$s + C] = $t I - сохраняет два типа word из $t и следующего регистра в: MEM[$s+C] и следующие 7 байтов. Порядок операндов может создать путаницу.
Store word sw $t,C($s) Memory[$s + C] = $t I 2B 16 - сохраняет word в: MEM[$s+C] и следующие 3 байта. Порядок операндов может создать путаницу.
Store half sh $t,C($s) Memory[$s + C] = $t I 29 16 - сохраняет первую половину регистра (halfword) в: MEM[$s+C] и следующий байт.
Store byte sb $t,C($s) Memory[$s + C] = $t I 28 16 - сохраняет первую четверть регистра (byte) в: MEM[$s+C].
Load upper immediate lui $t,C $t = C << 16 I F 16 - Загружает 16-битный операнд в вышестоящие 16 битов определенного регистра. Максимальная величина константы 2 16 −1
Move from high mfhi $d $d = HI R 0 10 16 Помещает значение из HI в регистр. Не используйте инструкции умножения и деления внутри инструкции mfhi (это действие не определено из-за конвейера MIPS).
Move from low mflo $d $d = LO R 0 12 16 Помещает значение из LO в регистр. Не используйте инструкции умножения и деления внутри инструкции mflo (это действие не определено из-за конвейера MIPS).
Move from Control Register mfcZ $t, $s $t = Coprocessor[Z].ControlRegister[$s] R 0 Перемещает 4-байтовое значение из сопроцессора регистра Z-контроля в регистр общего назначения. Расширение знака.
Move to Control Register mtcZ $t, $s Coprocessor[Z].ControlRegister[$s] = $t R 0 Перемещает 4-байтовое значение из регистра общего назначения в сопроцессор регистра Z-контроля. Расширение знака.
Логическая And and $d,$s,$t $d = $s & $t R 0 24 16 Побитовая конъюнкция
000000ss sssttttt ddddd--- --100100
And immediate andi $t,$s,C $t = $s & C I C 16 - 001100ss sssttttt CCCCCCCC CCCCCCCC
Or or $d,$s,$t $d = $s | $t R 0 25 16 Побитовая дизъюнкция
Or immediate ori $t,$s,C $t = $s | C I D 16 -
Exclusive or xor $d,$s,$t $d = $s ^ $t R 0 26 16
Nor nor $d,$s,$t $d = ~ ($s | $t) R 0 27 16 Bitwise nor
Set on less than slt $d,$s,$t $d = ($s < $t) R 0 2A 16 Проверяет, является ли один регистр меньше другого.
Set on less than immediate slti $t,$s,C $t = ($s < C) I A 16 - Проверяет, является ли один регистр меньше константы.
Битовый сдвиг Shift left logical sll $t,$s,C $t = $s << C R 0 0 сдвигает С битов влево (умножает степенями двойки 2 C O N S T {\displaystyle 2^{CONST}} )
Shift right logical srl $t,$s,C $t = $s >> C R 0 2 16 сдвигает С битов вправо (делит степенями двойки 2 C {\displaystyle 2^{C}} ). Заметьте, что эта инструкция работает как деление в дополнительным двоичном коде, только если значение положительно.
Shift right arithmetic sra $t,$s,C $ t = $ s >> C + ((∑ n = 1 CONST 2 31 − n) ⋅ $ 2 >> 31) {\displaystyle \scriptstyle \$t=\$s>>C+\left(\left(\sum _{n=1}^{\text{CONST}}2^{31-n}\right)\cdot \$2>>31\right)} R 0 3 16 сдвигает С битов - (делит в двоичном дополнительном коде степенями двойки)
Условное ветвление Branch on equal beq $s,$t,C if ($s == $t) go to PC+4+4 °C I 4 16 - Переходит к инструкции по указанному адресу, если два регистра равны.
000100ss sssttttt CCCCCCCC CCCCCCCC
Branch on not equal bne $s,$t,C if ($s != $t) go to PC+4+4 °C I 5 16 - Переходит к инструкции по указанному адресу, если два регистра не равны.
Безусловный переход Jump j C PC = PC+4 . C*4 J 2 16 - Выполняет безусловный переход к инструкции по указанному адресу.
Jump register jr $s goto address $s R 0 8 16 Переходит по адресу, содержащемуся в указанном регистре.
Jump and link jal C $31 = PC + 8; PC = PC+4 . C*4 J 3 16 - Как процедура - применяется для вызова подпрограммы, регистр $31 получает и возвращает адрес; возврат из подпрограммы совершает jr $31. Адресом возврата будет PC + 8, а не PC + 4, в связи с использованием слота задержки перехода (delay slot): любая команда перехода в архитектуре (до введения новых инструкций MIPS32/MIPS64 в 2014-ом) всегда предваряется выполнением следующей за ней команды, а уже потом собственно переходом. Это позволяло более равномерно нагрузить конвеер - пока команда перехода извлекала инструкцию по адресу перехода процессор не простаивал, а исполнял следующую за ней команду, что, однако, влечет сложность чтения и правильного понимания ассемблерного кода и требует учета компиляторами.

Примечание : в коде языка ассемблера MIPS, смещение для ветвящихся инструкций может быть представлено маркировками в другом месте кода.

Примечание : Не существует соответствующей команды «копирование в регистр» (load lower immediate); это можно сделать с помощью функций addi (add immediate) или ori (or immediate) c регистром $0. Например, обе команды addi $1, $0, 100 и ori $1, $0, 100 загружают в регистр $1 значение 100.

Операции над числами с плавающей запятой

MIPS имеет 32 регистра с плавающей запятой. Регистры соединены по 2 для двойной точности вычислений. Регистры с нечетными номерами не могут быть использованы для арифметических операций или ветвления, они могут лишь частично указывать двойную точность в паре регистров.

Категория Название Синтаксис инструкции Значение Формат/код/функция Примечания/Кодирование
Арифметические FP add single add.s $x,$y,$z $x = $y + $z Сложение чисел с плавающей запятой (одинарная точность)
FP subtract single sub.s $x,$y,$z $x = $y - $z Вычитание чисел с плавающей запятой (одинарная точность)
FP multiply single mul.s $x,$y,$z $x = $y * $z Умножение чисел с плавающей запятой (одинарная точность)
FP divide single div.s $x,$y,$z $x = $y / $z Деление чисел с плавающей запятой (одинарная точность)
FP add double add.d $x,$y,$z $x = $y + $z Сложение чисел с плавающей запятой (двойная точность)
FP subtract double sub.d $x,$y,$z $x = $y - $z Вычитание чисел с плавающей запятой (двойная точность)
FP multiply double mul.d $x,$y,$z $x = $y * $z Умножение чисел с плавающей запятой (двойная точность)
FP divide double div.d $x,$y,$z $x = $y / $z Деление чисел с плавающей запятой(двойная точность)
Передача данных Load word coprocessor lwcZ $x,CONST ($y) Coprocessor[Z].DataRegister[$x] = Memory[$y + CONST] I Загружает 4 байта типа word из: MEM[$2+CONST] в регистр данных сопроцессора. Расширение знака.
Store word coprocessor swcZ $x,CONST ($y) Memory[$y + CONST] = Coprocessor[Z].DataRegister[$x] I Записывает 4 байта из регистра данных сопроцессора в MEM[$2+CONST]. Расширение знака.
Логические FP compare single (eq, ne, lt, le, gt, ge) c.lt.s $f2,$f4 if ($f2 < $f4) cond=1; else cond=0 Сравнение на меньшее команд с плавающей запятой. Одинарная точность.
FP compare double (eq, ne, lt, le, gt, ge) c.lt.d $f2,$f4 if ($f2 < $f4) cond=1; else cond=0 Сравнение на меньшее команд с плавающей запятой. Двойная точность.
Ветвление branch on FP true bc1t 100 if (cond == 1) go to PC+4+100 если формат FP, выполняется ветвление.
branch on FP false bc1f 100 if (cond == 0) go to PC+4+100 если формат не FP, выполняется ветвление.

Псевдоинструкции

Эти инструкции принимаются языком ассемблера MIPS, однако они не являются реальными. Ассемблер переводит их в последовательности настоящих инструкций.

Название Синтаксис инструкции Трансляция в обычную инструкцию значение
Load Address la $1, LabelAddr lui $1, LabelAddr; ori $1,$1, LabelAddr $1 = Маркировка адреса
Load Immediate li $1, IMMED lui $1, IMMED; ori $1,$1, IMMED $1 = 32-битное прямое значение
Branch if greater than bgt $rs,$rt,Label slt $at,$rt,$rs; bne $at,$zero,Label if(R>R) PC=Label
Branch if less than blt $rs,$rt,Label slt $at,$rs,$rt; bne $at,$zero,Label if(R
Branch if greater than or equal bge etc. if(R>=R) PC=Label
Branch if less than or equal ble if(R<=R) PC=Label
Branch if greater than unsigned bgtu if(R=>R) PC=Label
Branch if greater than zero bgtz if(R>0) PC=Label
Multiplies and returns only first 32 bits mul $1, $2, $3 mult $2, $3; mflo $1 $1 = $2 * $3

Несколько других важных инструкций

  • NOP (без операции) (машинный код 0x00000000, интерпретируется процессором как sll $0, $0, 0)
  • Break (разрывы программы, используется отладчиками)
  • Системный вызов (используется для системных вызовов операционной системы)

Использование регистра транслирования

Аппаратная архитектура определяет следующие критерии:

  • Регистр общего назначения $0 всегда возвращает значение 0.
  • Регистр общего назначения $31 используется в качестве регистра-ссылки для команд перехода и связи.
  • HI и LO используются для доступа к результатам умножения/деления, доступ к которым осуществляется командами mfhi (move from high) и mflo (move from low).

Это единственные ограничения, которые аппаратная архитектура накладывает на использование регистров общего назначения.

Различные устройства MIPS реализовывают специальные соглашения о вызовах, которые ограничивают использование регистров. Соглашения о вызовах полностью поддерживаются комплексом ПО, но не требуются аппаратным обеспечением.

Регистры
Название Номер Применение нужно ли резервировать?
$zero $0 всегда хранит 0 N/A
$at $1 временный регистр для языка ассемблера НЕТ
$v0-$v1 $2–$3 значения функций и выражений НЕТ
$a0-$a3 $4–$7 аргументы функций НЕТ
$t0-$t7 $8–$15 временные НЕТ
$s0-$s7 $16–$23 сохраненные временные значения ДА
$t8-$t9 $24–$25 временные НЕТ
$k0-$k1 $26–$27 зарезервирована для ядра операционной системы НЕТ
$gp $28 глобальный указатель ДА
$sp $29 указатель стека ДА
$fp $30 указатель фрейма ДА
$ra $31 адрес возврата N/A

Защищенные регистры (по соглашению ) не могут быть изменены вызовом системы или процедуры (функции). Например, $s-регистры должны быть сохранены в стеке процедурой, которая собирается ими воспользоваться; к $sp и $fp-регистрам приращиваются константы, а по окончании процедуры регистры вновь уменьшаются. Противоположным примером служит регистр $ra, который автоматически меняется при его вызове любой функцией. $t-регистры должны сохраняться программой перед вызовом любой процедуры (если программе нужны данные, полученные после вызова).

Эмуляторы

Среди Open Virtual Platforms существует бесплатный эмулятор OVP-sim , доступный для некоммерческого использования, который представляет собой библиотеку моделей процессоров и платформ, а также интерфейсов API, позволяющих пользователю проектировать свои собственные модели. Библиотека моделей является открытым ресурсом, написанным на языке С, и включает в себя ядра MIPS 4K, 24K и 34K. Данные модели созданы и поддерживаются компанией Imperas, которая в сотрудничестве с MIPS Technologies протестировала эмулятор и отметила его знаком MIPS-Verified. Образцы платформ, основанных на MIPS, включают в себя как само металлическое оборудование, так и платформы для загрузки немодифицированных двоичных отображений Linux. Такие платформы-эмуляторы эффективны для обучения, а также доступны, бесплатны и просты в использовании. OVPsim , разработанный и поддерживаемый Imperas, работает с высокой скоростью (сотни миллионов инструкций с секунду), и применим для описания многоядерных архитектур.

Существует свободно доступный эмулятор MIPS32 (ранние версии могли имитировать только R2000/R3000 ), выпущенный под названием SPIM и предназначенный для использования в обучении. EduMIPS64 - это межплатформенный графический эмулятор процессора MIPS64, написанный на языке Java /Swing . Он поддерживает множество MIPS64 ISA и позволяет пользователю наглядно увидеть, что происходит в конвейере, когда ЦП выполняет программу на языке ассемблера. Проект имеет строго образовательные цели и широко используется на некоторых курсах компьютерной архитектуры во всем мире.

Ещё один GUI-эмулятор процессоров MIPS - это MARS , тоже разработанный в образовательных целях, особенно эффективен вкупе с книгой Хеннесси Computer Organization and Design .

Более продвинутые версии бесплатных эмуляторов - Gxemul (ранее известные как проекты mips64emul), а также проекты QEMU . Они имитируют различные модели микропроцессоров MIPS III и MIPS IV (в качестве дополнения к компьютерным системам, их использующим).

Коммерческие разработки эмуляторов доступны в основном для встроенного использования процессоров MIPS, например, Virtutech Simics (MIPS 4Kc и 5Kc, PMC RM9000, QED RM7000), VaST Systems (R3000, R4000), и CoWare (MIPS4KE, MIPS24K, MIPS25Kf и MIPS34K).



Есть вопросы?

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: