MMIX - MMIX

MMIX
Дизайнер Дональд Кнут
Биты 64-битный
Введено 1999 г.
Дизайн RISC
Кодирование Фиксированный
Разветвление Код состояния
Порядок байтов Большой
Открытым Да, и без лицензионных отчислений
Регистры
32 специальных регистра
Общее назначение 256

MMIX (произносится как em-mix ) - это 64-битная архитектура вычислений с сокращенным набором команд (RISC), разработанная Дональдом Кнутом при значительном вкладе Джона Л. Хеннесси (который внес свой вклад в разработку архитектуры MIPS ) и Ричарда Л. Сайта ( который был архитектором архитектуры Альфа ). Кнут сказал, что

MMIX - это компьютер, предназначенный для иллюстрации аспектов программирования на уровне машины. В моих книгах «Искусство программирования» он заменяет MIX , машину в стиле 1960-х, которая раньше играла такую ​​роль… Я стремился спроектировать MMIX так, чтобы ее машинный язык был простым, элегантным и легким для изучения. В то же время я тщательно включил все сложности, необходимые для достижения высокой производительности на практике, чтобы MMIX в принципе мог быть построен и даже, возможно, мог конкурировать с некоторыми из самых быстрых универсальных компьютеров на рынке ».

Кнут начал разработку MMIX в 1999 году и выпустил стабильную версию проекта в 2011 году. Процессор имеет номер «2009», и Кнут поясняет, что это среднее арифметическое из чисел других компьютерных архитектур; а также быть "MMIX" римскими цифрами .

Архитектура

MMIX - это 64-разрядный компьютер с сокращенным набором команд (RISC) с обратным порядком байтов , имеющий 256 64-разрядных регистров общего назначения, 32 64-разрядных регистра специального назначения, 32-разрядные инструкции фиксированной длины и 64-разрядный виртуальный адрес. пространство . Набор команд MMIX состоит из 256 кодов операций, один из которых зарезервирован для будущего расширения. MMIX использует числа с плавающей запятой IEEE 754 .

инструкции

Все инструкции имеют соответствующую мнемонику. Например, инструкция №20 (32 десятичных числа) связана с ADD. Большинство инструкций имеют символьную форму OP X,Y,Z, где OP указывает тип инструкции, X указывает регистр, используемый для хранения результата инструкции, а остальные определяют операнды инструкции. Каждое из этих полей имеет ширину восемь бит. Например, это ADD $0,$1,3означает «Установить 0 долларов на сумму 1 и 3 долларов».

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

Программы MMIX обычно создаются с использованием языка ассемблера MMIXAL. Ниже представлена ​​простая программа MMIXAL, которая выводит строку « Hello, world! »:

        LOC   #100                   % Set the address of the program
                                     % initially to 0x100.

Main    GETA  $255,string            % Put the address of the string
                                     % into register 255.

        TRAP  0,Fputs,StdOut         % Write the string pointed to by
                                     % register 255 to the standard
                                     % output file.

        TRAP  0,Halt,0               % End process.

string  BYTE  "Hello, world!",#a,0   % String to be printed.  #a is
                                     % newline, 0 terminates the
                                     % string.

Регистры

В микросхеме MMIX имеется 256 непосредственно адресуемых архитектурных регистров общего назначения, обозначенных от $ 0 до 255, и 32 специализированных архитектурных регистра. Доступ к специальным регистрам можно получить с помощью инструкций GET и PUT. Два специальных регистра, rL и rG, определяют, какие из общих регистров являются локальными, а какие - глобальными. Все регистры от $ 0 ... ([rL] - 1) являются локальными регистрами и представляют собой окно во внутренний стек регистров. Регистры из [rL] ... ([rG] - 1) являются «маргинальными регистрами», они всегда возвращают 0, если используются в качестве источника в операции. Использование маргинального регистра в качестве места назначения операции приведет к тому, что машина автоматически увеличит rL, чтобы включить этот регистр. Все регистры [rG] ... $ 255 называются глобальными регистрами и не являются частью стека регистров.

Стек локальных регистров

Стек локальных регистров предоставляет каждой подпрограмме свои собственные локальные регистры rL, обозначенные от $ 0 до $ (rL - 1) . Каждый раз, когда вызывается подпрограмма, несколько локальных регистров опускаются вниз по стеку (сдвигая начало окна). Аргументы вызываемой подпрограммы остаются в оставшихся локальных регистрах. Когда подпрограмма завершает свою работу, она выталкивает ранее введенные регистры. Поскольку внутренний стек может содержать только конечное число регистров, может потребоваться сохранить часть стека в памяти. Это реализовано с помощью специальных регистров rO и rS, которые записывают, какая часть стека локальных регистров находится в памяти, а какая часть все еще находится в локальных физических регистрах. Стек регистров обеспечивает быстрое связывание подпрограмм.

Специальные регистры

К 32 специальным физическим архитектурным регистрам относятся следующие:

  1. rB, регистр начальной загрузки (поездка)
  2. При отключении rB ← 255 $ и 255 $ ← rJ. Таким образом сохраняется rJ в общем регистре.
  3. rD, регистр дивидендов
    Беззнаковое целочисленное деление использует это как левую половину 128-битного ввода, которая должна быть разделена другим операндом.
  4. rE, эпсилон-регистр
    Используется для плавающих сравнений относительно эпсилона.
  5. rH, химический регистр
    Используется для хранения левой половины 128-битного результата умножения целых чисел без знака.
  6. rJ, регистр обратного перехода
    Используется для сохранения адреса следующей инструкции с помощью PUSHes и POP для возврата из PUSH.
  7. rM, регистр маски мультиплексирования
    Используется мультиплексной инструкцией.
  8. rR, регистр остатка
    Устанавливается на остаток от целочисленного деления.
  9. rBB, регистр начальной загрузки (ловушка)
    При треппинге rBB ← $ 255 и $ 255 ← rJ. Таким образом, сохраняя rJ в общем регистре
  10. rC, счетчик циклов
    Увеличивается каждый цикл.
  11. rN, серийный номер
    Константа, идентифицирующая этот конкретный процессор MMIX.
  12. rO, смещение стека регистров
    Используется для реализации стека регистров.
  13. rS, указатель стека регистров
    Используется для реализации стека регистров.
  14. rI, счетчик интервалов
    Уменьшается каждый цикл. Вызывает прерывание при нуле.
  15. rT, регистр адреса прерывания
    Используется для хранения адреса вектора отключения.
  16. rTT, регистр адреса динамической ловушки
    Используется для хранения адреса вектора прерывания.
  17. rK, регистр маски прерывания
    Используется для включения и отключения определенных прерываний.
  18. rQ, регистр запроса прерывания
    Используется для записи прерываний по мере их возникновения.
  19. rU, счетчик использования
    Используется для подсчета выполненных инструкций.
  20. rV, виртуальный регистр перевода
    Используется для преобразования виртуальных адресов в физические. Содержит размер и количество сегментов, корневое расположение таблицы страниц и номер адресного пространства.
  21. rG, регистр глобального порога
    Все ссылки на общие регистры с номером больше или равным rG относятся к глобальным регистрам.
  22. rL, локальный пороговый регистр
    Все ссылки на общие регистры с номером меньше rL относятся к локальным регистрам.
  23. rA, регистр арифметического статуса
    Используется для записи, включения и отключения арифметических исключений, таких как переполнение и деление на ноль.
  24. rF, регистр местоположения отказа
    Используется для хранения адреса инструкции, вызвавшей сбой.
  25. rP, регистр прогноза
    Используется условным свопом (CSWAP).
  26. rW, регистр прерывания (отключение)
    Используется при отключении для сохранения адреса инструкции после той, которая была прервана.
  27. rX, регистр исполнения (поездка)
    Используется при отключении для сохранения прерванной инструкции.
  28. rY, операнд Y (поездка)
    Используется при отключении для сохранения операнда Y прерванной инструкции.
  29. rZ, операнд Z (поездка)
    Используется при отключении для сохранения операнда Z прерванной инструкции.
  30. rWW, регистр прерывания (прерывание)
    Используется при захвате для сохранения адреса инструкции после той, которая была прервана.
  31. rXX, регистр выполнения (ловушка)
    Используется при захвате для сохранения прерванной инструкции.
  32. rYY, операнд Y (ловушка)
    Используется при захвате для сохранения операнда Y прерванной инструкции.
  33. rZZ, операнд Z (ловушка)
    Используется при захвате для сохранения операнда Z прерванной инструкции.

Как и программы, работающие почти на всех других процессорах, программы MMIX можно прерывать несколькими способами. Внешнее оборудование, такое как таймеры, является частым источником прерываний с вытеснением (вычислением) . Многие инструкции вызывают прерывание в определенных исключительных случаях; например, исключения ошибок страницы защиты памяти, используемые для реализации виртуальной памяти, и обработка исключений с плавающей запятой . MMIX имеет 2 типа прерываний: «отключения» и «ловушки». Основное различие между «срабатываниями» и «ловушками» состоит в том, что ловушки передают управление программе «обработчика ловушек» в операционной системе (перехват), а расцепления отправляют управление программе «обработчик отключения» в пользовательском приложении (отключение). Пользователи также могут принудительно запустить любой обработчик прерывания с помощью явных программных инструкций прерывания TRIP и TRAP, подобно некоторым видам ловушек в других компьютерных системах. В частности, системный вызов из пользовательской программы в операционную систему использует инструкцию TRAP.

Аппаратные реализации

По состоянию на октябрь 2015 года известных аппаратных реализаций архитектуры набора команд MMIX не существует. Однако проект fpgammix реализует MMIX в Verilog , что делает возможным реализацию с использованием программируемой пользователем вентильной матрицы .

Программные инструменты

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

Симуляторы и ассемблер

  • MMIXware - простой (поведенческий) симулятор MMIX-SIM Дональда Кнута, ассемблер MMIXAL, набор тестов, примеры программ, полная документация и архитектурный (конвейерный) симулятор MMIX ( gzipped tarфайл).
  • MMIXX - An X11 -На графический пакет вклад Эндрю Pochinsky из MIT «ы Центра теоретической физики , которые в сочетании с источниками MMIXware выше, дополняющая виртуальная машина MMIX с 640 × 480 пикселей , полноцветный „виртуального дисплея“( для UNIX / Linux).

Компилятор

GNU Compiler Collection включает в себя MMIX фоновым для своих C / C ++ компиляторов, внесли свой вклад Ханс-Петер Нильссон и части основного распространения GCC начиная с конца 2001 года по состоянию на ноябрь 2017 г. MMIX фоновым для GCC продолжает активно разработан и поддерживается волонтерами.

  • Инструкции по установке инструментов GCC + MMIX от Hans-Peter Nilsson.
  • §3.17.26. Параметры MMIX для GNU GCC версии 7.2.0 (веб-сайт GNU GCC).
  • §9.28.  MMIX-зависимые функции для GNU , как с GNU Binutils версии 2.29, ассемблер фоновым для GNU GCC (GNU Binutils веб - сайта).

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

Смотрите также

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

  • Дональд Э. Кнут (2005). Искусство программирования. Том 1, часть 1: MMIX - компьютер RISC для нового тысячелетия . Эддисон-Уэсли. ISBN  0-201-85392-2 (опечатки)

внешние ссылки