Принципы развития ЭВМ и RISC-V

Базовая статья — в Википедии

Конец 1970-х / начало 80-х: новые архитектуры ЭВМ

Увеличение сложности поначалу (1970-е) было удачным ходом (PDP-10/11, Motorola 68k+, …), но дальнейшее усложнение было либо невозможно, либо приводило к сверхсложным архитектурам (поздние версии VAX, PentiumII, … — 1980-е/90-е)

Отдельная ветка развития — это архитектуры VLIW (Very Long Instruction Word), в которых одна команда может задействовать большое количество вычислительных устройств (сейчас это направление ушло в GPU).

RISC наиболее эффективно развивались в 1990-е/2000-е (DEC Alpha, MIPS, Sparc, Power, ARM, AVR, SGI, …).

RISC-V

Архитектура RISC-V появилась намного позже — в 2010, и немедленно заместила собой своего предшественника — MIPS. Немного истории:

Соответствие принципам RISC (унаследовано от MIPS)

Главная особенность — Open Hardware

Спецификация:

Эмулятор RARS

(прототип: MARS)

RARS (RISC-V Assembler and Runtime Simulator).

Документация

На 2024-06-24 в состав репозитория ALT Linux Team входит расширенная версия с исправлениями в работе с регистрами управления и возможностью запуска с включённым таймером.

Интерфейс RARS разработан таким образом, чтобы вся нужная информация и инструменты находились на экране одновременно. По сути, это интегрированная среда разработки с редактором, отладчиком и встроенным эмулятором.

Редактирование файлов на языке ассемблера:

RARS_Edit.png

  1. Все доступные функции RARS отражены в меню (если в данный момент функция недоступна, она замазана серым)
  2. Часть функций доступна в виде пиктограмм
  3. Вкладка «Редактор»
  4. Внутренние вкладки с именами редактируемых файлов
  5. Текстовый редактор с подсветкой синтаксиса ассемблера RISC-V

RARS_Run.png

  1. Блок пиктограмм «компиляция - запуск - отладка»
  2. Скорость эмуляции (если не выставлена на максимум, после выполнения каждой инструкции содержимое соответствующих окон обновляется)
  3. Вкладка «Выполнение»
  4. Окно дизассемблированного участка оперативной памяти, в котором указан адрес инструкции, содержимое ячейки в числовом и в дизассемблированном виде, а также соответствующая строка исходного текста (в случае псевдоинструкции может не совпадать с дизассемблированным представлением)
  5. Активированная точка останова на конкретной инструкции
  6. Окно меток (адреса, соответствующие идентификаторам в программе)
  7. Окно регистров (содержимое каждого регистра можно редактировать вручную)
  8. Окно содержимого оперативной памяти (ячейки памяти можно редактировать вручную)
  9. Откуда начинать просмотр памяти (переход на соседние участки) и выбор стандартного базового адреса (стек, куча, область глобальных данных и т. д.)
  10. Формат представления ячеек памяти
  11. Вкладка сообщений от ассемблера и исполняющей системы «Messages» и вкладка «Run I/O», предназначенная для ввода и вывода данных с помощью внешних вызовов

Цикл разработки

  1. В окне редактора набираем текст программы на языке ассемблера и сохраняем её в файл (без этого шага трансляция работать не будет)

  2. Продолжаем редактирование
  3. Нажимаем кнопку компиляции (с ключом и отвёрткой) или RunAssemble в меню

  4. Если в окне сообщений выдалась ошибка, кнопка запуска становится недоступна — надо вернуться к п. (1) и исправить ошибку
  5. Если ошибок трансляции не было, открывается вкладка «Execute» и можно нажимать кнопку запуска или RunRun в меню

    • При этом в нижней части откроется вкладка «Run I/O» — если в программе предусмотрен ввод, вводить надо с клавиатуры в эту вкладку, туда же попадёт и вывод программы

Отступление про современные и не очень архитектуры

Развитие индустрии, даже (в особенности?) наукоёмкой, подпадает под т. н. «принцип легаси»:

  1. Появление новой задачи,
  2. Победа одного-двух частных решений этой задачи, актуальных для своего времени
  3. «Канонизация» этих решений (legacy)
  4. Legacy впоследствии (почти) не пересматривается — до тех пор, пока не станет непреодолимым препятствием в решении актуальной задачи. Далее см. п. 1

Пример: «Принципы фон Неймана» как исторический казус.

Общее правило: «так пошла эволюция, переделывать дороже».

Побитовые операции

Представление числа (повторение):

Чаще всего побитовые операции нужны, когда отдельные биты числа имеют собственное значение. Например, старший (знаковый) бит отражает знак целого числа, младший равен 0 для чётных чисел и 1 для нечётных и т. п. Регистр флагов в учебных машинах (и не только в них) устроен по тому же принципу: каждый его бит — это отдельный элемент данных.

Распространение знака

Распространение знака — это не отдельная команда RISC-V, а свойство всех знаковых операций. Если последний бит (в архитектуре rv32 — тридцать первый) числа равен 1, его можно интерпретировать как отрицательное вы диапазоне от

Для следующих побитовых операций можно воспользоваться вот такой (пока что — вполне непонятной) программой:

   1 .macro  printb  %prompt %reg %ecall # Вывод регистра в двоичном виде в отдельной строке
   2 .data
   3 prompt: .asciz  %prompt
   4 .text
   5         li      a7 4            # Вывод строки
   6         la      a0 prompt
   7         ecall
   8         li      a7 %ecall       # Вывод числа в требуемом виде
   9         mv      a0 %reg
  10         ecall
  11         li      a7 11           # Вывод перевода строки
  12         li      a0 '\n'
  13         ecall
  14 .end_macro
  15 
  16 .macro  printop %c1  %op %c2 %id        # Результат применения двухместной операции к парметрам
  17         li      t0 %c1
  18         li      t1 %c2
  19         printb  "    " t0 35
  20         printb  %id t1 35
  21         %op     t0 t0 t1
  22         printb  " == " t0 35
  23         printb  "    " t0 34
  24 .end_macro
  25 
  26 .text:
  27         printop 0x12345678 and 0x90abcdef "AND "

В действительности нас интересует только последняя строка этой программы — подстановка макроса printop. Этот макрос выводит два параметра бинарной операции и её результат в двоичном виде. У макроса четыре параметра:

  1. Первый операнд
  2. Инструкция RISC-V (годится любая типа R)
  3. Второй операнд
  4. Строка с названием операции (для удобства чтения должна состоять из 4 символов)

Числа в шестнадцатеричной системе счисления очень просто переводить в двоичную — достаточно заменить каждую шестнадцатеричную цифру на ровно четыре цифры соответствующего ей двоичного числа. Например a96e16 = 10101001011011102.

Побитовые «И», «ИЛИ» и «исключающее ИЛИ»

Вспомним простые правила вычисления логических операций «И», «ИЛИ» и «исключающее ИЛИ»:

X

Y

X and Y

X

Y

X or Y

X

Y

X xor Y

0

0

0

0

0

0

0

0

0

0

1

0

0

1

1

0

1

1

1

0

0

1

0

1

1

0

1

1

1

1

1

1

1

1

1

0

Один из приемов работы с битовыми данными — использование маски. Маска позволяет получать значения только определенных битов в ячейке.

Операция and нужна, чтобы проверить, чему равен конкретный бит:

Операция or используется для того, чтобы установить конкретный бит (или группу битов) в значение 1

Ещё одно применение and — установить бит или группу битов в 0. Для этого применяется маска, в которой в 1 выставлены все биты, кроме требуемых

Операция xor используется для того, чтобы поменять конкретный бит или группу битов на противоположные

Инструкция для этих операций в RISC-V называются так же, как в таблице: and, or и xor.

FrBrGeorge/MyDict/speech_balloon_question.png Проверьте их работу, заменив соответствующие параметры printop в программе.

У побитового «ИЛИ» есть замечательное свойство — обратимость. В самом деле, если N = A xor B, то про N можно сделать четыре утверждения:

  1. Биты числа N — это биты числа B, часть которых заменена на противоположные там, где были единичные биты у числа A

  2. Биты числа N — это биты числа A, часть которых заменена на противоположные там, где были единичные биты у числа B

  3. A = N xor B

  4. B = N xor A

FrBrGeorge/MyDict/speech_balloon_question.png Проверьте все эти утверждения с помощью программы, подставляя в printop результаты предыдущих её запусков

Побитовый сдвиг

<!> Правило «сдвиг M влево на n = умножение M на 2n» не работает, если |M| * 2n не помещается в машинное слово.

Инструкции RISC-V:

FrBrGeorge/MyDict/speech_balloon_question.png Почему нет арифметического сдавига влево?

FrBrGeorge/MyDict/speech_balloon_question.png Попробуйте эти операции в программе.

Пример.  Проверить является ли заданное положительное число степенью двойки. Если да записать в регистр $t3 1, иначе записать 0. Сейчас мы не готовы писать такую программу, но можно обсудить, как для проверки использовать побитовые операции. Идея решения: Переберём все маски с единственной единицей, и посчитаем, сколько будет ненулевых результатов операции and. Если ровно один, то исходное число было степенью двойки.

Алгоритм:

FrBrGeorge/MyDict/speech_balloon_question.png Проверьте, чему равен сдвиг 0x80000000 на 1 влево

LecturesCMC/ArchitectureAssemblerProject/06_AboutRISCV (последним исправлял пользователь FrBrGeorge 2024-07-16 21:35:18)