Imax9
NEWS   ARTICLES   MINIMIG   FILES   ABOUT

Как избежать создания ассемблера.

Предлагаю вам перевод цикла The EightThirtyTwo ISA Part 4: How to avoid writing an assembler автора Alastair M. Robinson.

Чтобы правильно поэкспериментировать с набором инструкций, мне нужен какой-то способ сборки и запуска программ. К счастью, некоторое время назад я написал симулятор ZPU, и он легко был переориентирован для набора команд EightThirtyTwo. Симулятор является частью проекта EightThirtyTwo на github.

В долгосрочной перспективе, чтобы быть полезным, этому ISA понадобится полнофункциональный набор инструментов, что означает написание бэкэнда для GCC или, возможно, LLVM, или, может быть, даже lcc, vbcc или какого – то другого компилятора C. Однако это будет кроличья нора сама по себе, и сейчас нам просто нужен быстрый и простой способ превратить ассемблерный текст в двоичный байтовый файл, готовый к выполнению.

Toolchain gcc вполне способен создавать двоичные байтовые файлы, в значительной степени независимо от процессора (кроме проблем с порядком байт), мы можем просто создать исходный файл языка ассемблера, целиком из директив .byte.

Еще лучше, если мы назовем наш файл сборки расширением .S вместо .s gcc сначала запускает его через препроцессор C. Это означает, что мы можем просто создать заголовочный файл, содержащий кучу #defines для наших инструкций, например:

#define cond .byte 0x00 +
#define mr .byte 0x08 +
#define sub .byte 0x10 +
#define cmp .byte 0x18 +
#define st .byte 0x20 +
#define stdec .byte 0x28 +
#define stx .byte 0x30 +
#define stbinc .byte 0x38 +
......

Затем мы определяем наши регистры и коды условий:

#define r0 0
#define r1 1
#define r2 2
#define r3 3
#define r4 4
#define r5 5
#define r6 6
#define r7 7

#define NEX 0
#define SGT 1
#define EQ 2
#define GE 3
#define SLT 4
#define NEQ 5
#define LE 6
#define EX 7

и теперь мы можем собрать программу EightThirtyTwo, используя стандартный gcc install – и цель не имеет значения! Теперь мы можем собрать очень простые инструкции следующим образом:

#include "assembler.pp"

start:
li 0x11
mr r2
li 0x7
add r2
cond NEX // Stop simulation

Мы можем сделать это с помощью следующих команд:

gcc -c test.S
objcopy -Obinary test.o test.bi

Поскольку нам приходится каскадировать несколько инструкций li для загрузки значений, которые не помещаются в одно слово инструкции, мы определим некоторые макросы для выполнения необходимого сдвига и маскирования, которые я назвал IMWn(x), где n колеблется от 5 до 0.

Вот тут-то мы и столкнулись с интересной проблемой. Поскольку мы создаем объектный файл и никогда не линкуем его, любые метки, которые мы определяем в нашем исходном файле, никогда не вычислятся до конечных адресов. Пока мы имеем дело с абсолютными значениями, проблем нет, но если мы попытаемся сдвинуть адрес перехода, то получим сообщение об ошибке: “Ошибка: недопустимые операнды (разделы.text и ABS)”. Чтобы решить эту проблему, мы просто вычитаем адрес нашей начальной метки (которая будет равна нулю), и теперь ассемблер gcc счастлив, потому что он имеет дело с абсолютным числом, а не с еще не окончательно перемещенным символом.

Я сделал еще пару изменений в ISA, наиболее заметным из которых является инструкция cond; режим условного выполнения будет отменен любой инструкцией, которая записывает данные в r7 (счетчик программ) – независимо от того, выполняется она или нет. Это означает, что мы часто можем опустить инструкцию cond EX, которая ранее была необходима для возврата к безусловному выполнению. Имея в виду эту незначительную настройку, мы можем, наконец, взглянуть на какой–то окончательный код - типа Hello World для EightThirtyTwo ISA:

include "assembler.pp"

start:
  li IMW0(message-start)
  mr r1
  li IMW1(0xffffffc0) // регистр UART
  li IMW0(0xffffffc0)
  mr r0
_loop:
  li IMW1(0x100) // флаг готовности TX UART
  li IMW0(0x100)
  mr r2
  ld r0
  and r2
  cond EQ
  li IMW0(PCREL(_loop))
  add r7

  ldbinc r1
  cond NEQ
  st r0
  li IMW0(PCREL(_loop))
  add r7

  cond NEX // Завершить симуляцию

message:
  .ascii "Hello, world!"
  .byte 0

Это дает нам 19 байтов кода и 14 данных, то есть в общей сложности 33 байта.


Адрес для контактов : imax9@narod.ru

Если вам понравились мои работы и вы желаете поддержать сайт - сделайте дотацию.

При копировании статьи – обязательна ссылка на авторство и источник. Без разрешения автора копирование запрещено.

© Максим Ильин 2022г.

Яндекс.Метрика