diff --git a/kvs_pass1.py b/kvs_pass1.py index 86b20b9..750eebb 100644 --- a/kvs_pass1.py +++ b/kvs_pass1.py @@ -13,13 +13,17 @@ import sys import csv +import struct # <--- НОВЫЙ ИМПОРТ sys.path.insert(0, '.') -from kvs_data import PAGE_SIZE,ALWAYS_STUB_INSTRUCTIONS, text_vaddr_base, align_up +from kvs_data import ( + PAGE_SIZE, text_vaddr_base, align_up, + ALWAYS_STUB_INSTRUCTIONS +) from kvs_encoder import encode_instruction # ========== ГЛОБАЛЬНОЕ СОСТОЯНИЕ ========== -entries = [] # (segment, address, virt_addr, byte, target, source, label, cmd_with_values, calc_target, calc_byte) +entries = [] current_address = 0 current_segment = '.header' last_segment = None @@ -45,7 +49,6 @@ entry_point = "_start" relocations = [] - def reset_state(): global entries, current_address, current_segment, last_segment global text_buffer, data_buffer, bnd_size, vaddr_data, vaddr_bnd @@ -107,14 +110,14 @@ def add_byte(value: int, source: str = "", target=None, labels_list=None): entries.append(( show_segment if show_segment else "", current_address, - f"0x{virt_addr:08x}", # виртуальный_адрес - f"0x{byte_val:02x}", # байт (в виде hex-строки) + f"0x{virt_addr:08x}", + f"0x{byte_val:02x}", target if target else "", source, effective_labels, - "", # команда_со_значениями (заполняется во втором проходе) - "", # рассчитанный_уводящий_адрес - f"0x{byte_val:02x}" # рассчитанный_байт (изначально = байт) + "", + "", + f"0x{byte_val:02x}" )) current_address += 1 @@ -127,33 +130,33 @@ def add_bytes(values, source: str = "", target=None): add_byte(v, source if i == 0 else "", target if i == 0 else None) +# ========== РЕФАКТОРИНГ: ИСПОЛЬЗУЕМ struct.pack ========== + def add_word16(value: int, source: str = "", target=None): - add_bytes([ - (value >> 0) & 0xFF, - (value >> 8) & 0xFF, - ], source, target) + """Добавляет 16-битное значение (little-endian)""" + add_bytes(struct.pack('> 0) & 0xFF, - (value >> 8) & 0xFF, - (value >> 16) & 0xFF, - (value >> 24) & 0xFF, - ], source, target) + """Добавляет 32-битное значение (little-endian)""" + add_bytes(struct.pack('> 0) & 0xFF, - (value >> 8) & 0xFF, - (value >> 16) & 0xFF, - (value >> 24) & 0xFF, - (value >> 32) & 0xFF, - (value >> 40) & 0xFF, - (value >> 48) & 0xFF, - (value >> 56) & 0xFF, - ], source, target) + """Добавляет 64-битное значение (little-endian)""" + add_bytes(struct.pack('> j*8) & 0xFF for j in range(8)] + # Вставляем 8 байт (uint64_t) + new_bytes = struct.pack('> j*8) & 0xFF for j in range(8)] + new_bytes = struct.pack('> j*8) & 0xFF for j in range(8)] + new_bytes = struct.pack('> j*8) & 0xFF for j in range(8)] + new_bytes = struct.pack('> j*8) & 0xFF for j in range(8)] + new_bytes = struct.pack('> j*8) & 0xFF for j in range(8)] + new_bytes = struct.pack('> j*8) & 0xFF for j in range(8)] + new_bytes = struct.pack('> j*8) & 0xFF for j in range(8)] + new_bytes = struct.pack('> j*8) & 0xFF for j in range(8)] + new_bytes = struct.pack('