Сначала нужно описать, что входит в новую машину (регистры, стек, память, что там еще...) и представить это в виде структуры.
Потом, какая разрядность команды и как она кодируется.
Какое устройство программы с байт-кодом, из каких частей она состоит.
Как это все будет считываться и по каким переменным или массивам раскладываться.
Потом, либо писать кусок кода для каждой инструкции в лоб, либо делать макросы, чтобы сократить код.
В виртуальную машину Интел64,
которая сможет выполнить ассемблерную программу "здравствуй мир"
входят 5 регистров:
# регистр ФРЕЙМ (RBP) // не нужен, пока нет подпрограмм
# регистр ВЕРШИНА_СТЕКА (RSP) // не нужен, пока нет подпрограмм
регистр АККУМУЛЯТОР (RAX)
регистр ДАННЫЕ (RDX)
регистр АДРЕС_ИСТОЧНИК (RSI)
регистр АДРЕС_ПРИЁМНИК (RDI)
регистр АДРЕС_КОМАНДЫ (RIP) // тоже, в принципе, не нужен, но используется неявно
три команды:
ЗАГРУЖАЕМ константа, %регистр
КСОРИМ %регистр, %регистр
ПОБУЖДАЕМ
две константы имён системных фунукций:
ЗОВ_ВЕЩАТЬ
ЗОВ_ЗАВЕРШИТЬСЯ
и одна константа
СТДВЫХ
Разрядность регистров 64 бита.
Программа имеет формат ELF-файла.
Считываться всё это будет из файла, в память начиная с наименьшего адреса.
Код сократить можно не только при помощи макросов, но и за счёт использования подпрограмм.
Как кодируются команды:
команды кодируются последовательностями байтов переменной длины
(Лис пока не успел записать все 4 последовательности байтов для трёх команд и кода вызова операционной системы,
но работает над этим)
Отредактировано Лис (2023-03-11 21:35:10)