В настоящее время я пишу компилятор для пользовательского asm-подобного языка программирования , и я действительно запутался в том, как сделать соответствующую относительную адресацию данных для информационных меток.PC-относительная адресация на компиляторе, подобном сборке
main LDA RA hello
IPT #32
HLT
hello .STR "Hello, world!"
Псевдокод выше, после компиляции, приводит к следующему: гекс
31 80 F0 20 F0 0C 48 65 6C 6C 6F 2C 20 77 6F 72 6C 64 21 00
3180
, F020
и F00C
инструкции в LDA
, IPT
и HLT
.
Как видно из кода, инструкция LDA
использует в качестве аргумента метку hello
. Который при компиляции становится значением 02
, что означает «Incremented PC + 0x02» (если вы посмотрите на код, это расположение строки «Hello, world!» По отношению к вызову LDA
. Дело в том, что: .STR
не является инструкцией, так как он только сообщает компилятору, что ему нужно добавить строку с завершением (0) в конце исполняемого файла, так что были ли другие инструкции после объявления метки hello
, это смещение было бы неправильным.
Но я не могу найти способ вычисления правильного смещения, кроме того, что компилятор может путешествовать во времени. Должен ли я его «скомпилировать» два раза? Сначала для этикеток данных, а затем для фактических инструкций ?
Смещение к объявлению 'hello' не будет изменяться более подробными инструкциями после переменной' .STR'. – kdopen