```markdown =========================== ПЛАН РЕАЛИЗАЦИИ СЛОЖНОЙ АДРЕСАЦИИ (ПОЛНАЯ ВЕРСИЯ) =========================== ## СТАТУС: ЧАСТИЧНО РЕАЛИЗОВАНО (v2.0) ### Уже реализовано: - ✅ Лексер: токены `[`, `]`, `NUMBER` - ✅ Парсер: распознавание `[метка]` и `[число]` - ✅ Pass1: корректный расчёт размера (7 байт для MOV с памятью) - ✅ Pass2: RIP-relative кодирование для абсолютной адресации - ✅ Поддержка меток в операндах памяти `[переменная]` - ✅ Рефакторинг: `kvs_pass2_encoder.py` отдельно --- ## 1. Общая схема изменений по модулям | Модуль | Что меняется | Сложность | Статус | |--------|--------------|-----------|--------| | `kvs_lexer.py` | новые токены: `[`, `]`, `+`, `-`, `*`, `NUMBER` | низкая | ✅ ГОТОВ | | `kvs_parser.py` | новая логика операндов: `parse_operand()`, `parse_memory_operand()` | высокая | ✅ ГОТОВ (базово) | | `kvs_data.py` | активация и уточнение форматов инструкций | средняя | ⚠️ ТРЕБУЕТ ДОРАБОТКИ | | `kvs_pass1.py` | динамический рассчёт размера инструкций с памятью | высокая | ✅ ГОТОВ (для абсолютной) | | `kvs_pass2_encoder.py` | разбор адресации → ModR/M + SIB + disp, генерация кода | очень высокая | ⚠️ ЧАСТИЧНО (только абсолютная) | --- ## 2. Детальный план по шагам (в порядке реализации) ### Шаг 1 — Лексер (`kvs_lexer.py`) ✅ РЕАЛИЗОВАН **Что сделано:** - Добавлены токены: `LBRACKET` (`[`), `RBRACKET` (`]`), `PLUS` (`+`), `MINUS` (`-`), `STAR` (`*`), `NUMBER` - Числа отделены от слов (поддержка десятичных, шестнадцатеричных, отрицательных) **Результат:** новые типы токенов на выходе лексера. --- ### Шаг 2 — Парсер (`kvs_parser.py`) ✅ РЕАЛИЗОВАН (базово) **Что сделано:** 2.1. Реализован `parse_operand()`: - Если токен `LBRACKET` → вызывает `parse_memory_operand()` - Иначе → возвращает значение токена (регистр/число/метка/строка) 2.2. Реализован `parse_memory_operand()`: - Разбирает содержимое между `[` и `]` - Поддерживает: `регистр`, `число`, `метка` - Возвращает строку вида `[раикс + рсикс*8 + 16]` (структура сохраняется) 2.3. **Ограничения текущей реализации:** - Поддерживается только простая форма `[метка]` и `[число]` - Сложные выражения `[reg + reg*scale + disp]` парсятся, но не кодируются **Результат:** AST содержит операнды памяти в каноническом строковом виде. --- ### Шаг 3 — Данные инструкций (`kvs_data.py`) ⚠️ ТРЕБУЕТ ДОРАБОТКИ **Что нужно сделать:** 3.1. Активировать (или добавить) записи для: | Мнемоника | Opcode | Тип (формат) | |-----------|--------|--------------| | `загрузить` | `48 8B` | `mov_reg_mem` | | `сохранить` | `48 89` | `mov_mem_reg` | | `загрузить_байт_из_памяти` | `8A` | `mov_reg8_mem` | | `сохранить_байт` | `88` | `mov_mem8_reg8` | | `загрузить_адрес` | `48 8D` | `lea` | | `переместить_с_нулями` | `48 0F B6` | `movzx` | | `переместить_со_знаком` | `48 0F BE` | `movsx` | | `втолкнуть_из_памяти` | `FF /6` | `push_mem` | | `вытолкнуть_в_память` | `8F /0` | `pop_mem` | | `обменять_с_памятью` | `48 87` | `xchg_mem` | 3.2. **Статус:** записи присутствуют в `kvs_data.py`, но используются не все. --- ### Шаг 4 — Первый проход (`kvs_pass1.py`) ✅ РЕАЛИЗОВАН (для абсолютной) **Что сделано:** 4.1. Написана функция `estimate_memory_operand_size(operand_str)`: - Парсит строку `[раикс + рсикс*8 + 16]` - Определяет наличие SIB, размер смещения 4.2. Модифицирована `estimate_size()`: - Для инструкций `загрузить`, `сохранить`, `загрузить_адрес` возвращает `7` (REX + opcode + ModRM + disp32) **Ограничения:** - Для сложных форм адресации размер не рассчитывается динамически --- ### Шаг 5 — Второй проход (`kvs_pass2_encoder.py`) ⚠️ ЧАСТИЧНО РЕАЛИЗОВАН #### 5.1. Структура данных для режима адресации ⚠️ НЕ РЕАЛИЗОВАНА Нужно создать класс/словарь `AddressingMode`: - `has_base` (bool) - `base_reg` (int 0–15 или None) - `has_index` (bool) - `index_reg` (int 0–15) - `scale` (1,2,4,8) - `has_disp` (bool) - `disp_value` (int) - `disp_size` (1 или 4) #### 5.2. Парсер адресации ⚠️ ЧАСТИЧНО РЕАЛИЗОВАН Реализована `parse_memory_operand()` в `kvs_pass2_encoder.py`: - Поддерживает `[число]` и `[метка]` - **Нет поддержки:** `[reg]`, `[reg+disp]`, `[reg+reg*scale]` #### 5.3. Кодирование ModR/M ⚠️ ЧАСТИЧНО РЕАЛИЗОВАНО Функция `encode_modrm_reg_mem_absolute()`: - Использует `mod=00, r/m=101` для RIP-relative - **Нет поддержки:** других режимов адресации #### 5.4. Кодирование SIB ❌ НЕ РЕАЛИЗОВАНО Функция `encode_sib()` отсутствует. #### 5.5. Кодирование смещения ⚠️ ЧАСТИЧНО РЕАЛИЗОВАНО `encode_displacement()` использует `struct.pack('