Компилятор lcc это нечто, что трудно описать простыми словами. Несмотря на некоторую схожесть моей архитектуры с PDP11, отличий намного больше, поэтому пришлось глубоко разбираться с принципами построения md-файла и долго долго отлаживать. В общем, пришлось с чистого листа писать свой md-файл, используя другие md-файлы в качестве справочников и источника вдохновения.
Отдельно стоит сказать о передаче параметров в функции. В каждой архитектуре своё соглашение о передаче параметров и это очень важный момент. Например, параметры могут передаваться через стек или в регистрах или через стек с использованием фрейма вызова. Я до конца не определился как лучше и оптимальнее передавать параметры. Пока склоняюсь к тому, чтобы первые три аргумента передавать в регистрах, а остальные в фрейме вызова. Но вопрос ещё не решённый. Некоторую пикантность добавляет факт, что архитектура не поддерживает индексацию с отрицательным смещением. Т.е. повторить как в x86-32 не получится - там указатель стека в определённый момент копируется регистр BP, а затем BP используется для обращения и к аргументам функции (положительное смещение), так и к локальным переменным (отрицательное смещение). Поскольку инструкций с отрицательным смещением у меня нет, то придётся как-то выкручиваться. В самом худшем случае, если ничего оптимального не придумаю, придётся расширять систему команд с добавлением отрицательных (со знаком минус) смещений.
Возможно вопрос можно решить с помощью обращения к локальным переменным через указатель стека - в этом случае смещение, указывающее на переменную, всегда будет положительным, но это пока только на уровне идеи.
Пока что lcc делает это так (альфа версия, которую нельзя показывать):
function main
dec sp, 4
mov (sp), radr
dec sp, 4
mov (sp), fp
mov fp, sp
;
lea r6, $10 ; reg <- ADDRGP4
dec sp, 4
mov (sp), r6 ; ARGP4 opd
load rtmp, 0
dec sp, 4
mov (sp), rtmp ; ARGI2(CNST)
call hello
inc sp, 8 ; pop args
mov r6, r0 ; LOADI4
mov r0, r6 ; LOADI4
L_11: ; LABELV
;
mov fp, (sp)
inc sp, 4
mov radr, (sp)
inc sp, 4
return
end ;; main
$10 db 'Luck',0
И вот это всё надо оптимизировать оптимизировать оптимизировать путём исправления MD файла.