diff --git a/kvs_data.py b/kvs_data.py index 4fb4482..93925ee 100644 --- a/kvs_data.py +++ b/kvs_data.py @@ -331,6 +331,45 @@ VARIABLE_SIZE_INSTRUCTIONS = { "переместить_со_знаком", # зависит от размера регистра } +# === ИНСТРУКЦИИ, ВСЕГДА ТРЕБУЮЩИЕ ЗАГЛУШКУ НА ПЕРВОМ ПРОХОДЕ === +# Эти инструкции содержат целевые метки в операндах, которые могут быть +# определены позже (в том числе в других секциях) +ALWAYS_STUB_INSTRUCTIONS = { + # Безусловные переходы + "переход", + "короткий_переход", + + # Вызовы + "вызвать", + + # Циклы + "цикл", + + # Длинные условные переходы (32-битное смещение) + "переход_если_равно", + "переход_если_неравно", + "переход_если_меньше", + "переход_если_больше", + "переход_если_меньше_или_равно", + "переход_если_больше_или_равно", + "переход_если_перенос", + "переход_если_нет_переноса", + "переход_если_ноль", + "переход_если_не_ноль", + + # Короткие условные переходы (8-битное смещение) + "короткий_переход_если_равно", + "короткий_переход_если_неравно", + "короткий_переход_если_меньше", + "короткий_переход_если_больше", + "короткий_переход_если_меньше_или_равно", + "короткий_переход_если_больше_или_равно", + "короткий_переход_если_перенос", + "короткий_переход_если_нет_переноса", + "короткий_переход_если_ноль", + "короткий_переход_если_не_ноль", +} + # === ВСПОМОГАТЕЛЬНЫЕ ФУНКЦИИ === diff --git a/kvs_pass1.py b/kvs_pass1.py index ee6eb17..86b20b9 100644 --- a/kvs_pass1.py +++ b/kvs_pass1.py @@ -15,7 +15,7 @@ import sys import csv sys.path.insert(0, '.') -from kvs_data import PAGE_SIZE, text_vaddr_base, align_up +from kvs_data import PAGE_SIZE,ALWAYS_STUB_INSTRUCTIONS, text_vaddr_base, align_up from kvs_encoder import encode_instruction # ========== ГЛОБАЛЬНОЕ СОСТОЯНИЕ ========== @@ -44,33 +44,6 @@ data_pos = 0 entry_point = "_start" relocations = [] -# Список инструкций, которые всегда должны получать заглушки в первом проходе -ALWAYS_STUB_INSTRUCTIONS = { - "переход", - "короткий_переход", - "вызвать", - "цикл", - "переход_если_равно", - "переход_если_неравно", - "переход_если_меньше", - "переход_если_больше", - "переход_если_меньше_или_равно", - "переход_если_больше_или_равно", - "переход_если_перенос", - "переход_если_нет_переноса", - "переход_если_ноль", - "переход_если_не_ноль", - "короткий_переход_если_равно", - "короткий_переход_если_неравно", - "короткий_переход_если_меньше", - "короткий_переход_если_больше", - "короткий_переход_если_меньше_или_равно", - "короткий_переход_если_больше_или_равно", - "короткий_переход_если_перенос", - "короткий_переход_если_нет_переноса", - "короткий_переход_если_ноль", - "короткий_переход_если_не_ноль", -} def reset_state():