Как создать умный генератор промежуточного кода

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

Опишу максимально кратко мой ассемблер:

• Он в текстовом виде сразу и выполняется, и пока байт код не делал (и не нужно, мне удобнее сразу так делать, ну и с байтами не умею работать)

• Инструкции ничем не особенные как и по названию так и по функционалу: mov, add, sub, mul, div, inc, dec, jmp, call, ret, push, pop, nop, lda, hlt, cmp

На счёт lda она создаёт указатель на адрес памяти

Также создал директиву dw которая создаёт строку и кладет её в указанный адрес памяти, ещё dn (число (integer) и dd (double число) (также повторюсь, что бы не парится с этими байтами решил сделать максимально просто)

• вм у меня регистровая (eax, ebx, edx, ecx)

• Для каждой программы выделяется 1 стек

• Для выполнение команд типа вывод в консоль решил использовать системные вызовы

• Для вывода используется не стандартная консоль а кастомная, соответственно имеем класс, который реализует функции для работы с ним, поэтому для удобства создал эти системные вызовы и тд

Ну и программа которая бесконечно пишет hello world будет выглядеть вот так:

;метаинформация

.aarch cvm ; указываем архитектуру
.alloc 1-1 ; выделим адресу "1"
;сам код 

lda text 1 ; создадим поинтер
dw *text "Hello world!"
mov ebx *text ; текст который нужно принтить
mov eax 1 ;номер вызова функции print
mov ecx 0 ; id консоли
loop: ; метка
int 0x80 ; номер прерывания
jmp loop

Описание языка:

Он может только создавать переменные (по факту это просто указатели на память), арифметические операции, и print

Вот эта же программа:

def string text = "Hello world!";
while (true) {
   print(text);
}

Значит главный вопрос:

Как мне создать достаточно умный компилятор что бы он знал:

• Как пользоваться регистрами, что у них хранится, что является мусором...

• Что при вызове функции print он сделал системный вызов, и взял во внимание что в регистрах может оказаться полезная информация и её нужно сохранить... А где? на стеке? или в памяти? и сколько надо адрес памяти выделить ?

Если что пишу компилятор и вм на java, поэтому если есть возможность для ответа используйте его.


Ответы (0 шт):