diff --git a/тесты/kvs_full_test.csv b/тесты/kvs_full_test.csv index cef0f9b..b6698ad 100644 --- a/тесты/kvs_full_test.csv +++ b/тесты/kvs_full_test.csv @@ -7,4 +7,7 @@ 1;тест_адресации1;Проверка абсолютной адресации по числовому адресу [0x402000] (код возврата 42) 1;тест_адресации2;Проверка абсолютной адресации по метке [переменная] (код возврата 43) 1;тест_адресации3;Проверка косвенной адресации через регистр [рбикс] (код возврата 99) -1;тест_бнд;Проверка BSS (.бнд): размер файла мал (<100KB), секция .bss тип NOBITS размер 1MB, сегмент LOAD c p_memsz>=1MB, код возврата 0 \ No newline at end of file +1;тест_бнд;Проверка BSS (.бнд): размер файла мал (<100KB), секция .bss тип NOBITS размер 1MB, сегмент LOAD c p_memsz>=1MB, код возврата 0 +1;тест_бнд_1;Проверка BSS: абсолютная адресация (запись/чтение) +1;тест_бнд_2;Проверка BSS: косвенная адресация через регистр (запись/чтение) +1;тест_бнд_3;Проверка BSS: смешанная адресация (абсолютная запись + косвенное чтение) \ No newline at end of file diff --git a/тесты/тест_бнд_1/тест_бнд_1.py b/тесты/тест_бнд_1/тест_бнд_1.py new file mode 100644 index 0000000..ce2e5ad --- /dev/null +++ b/тесты/тест_бнд_1/тест_бнд_1.py @@ -0,0 +1,74 @@ +#!/usr/bin/env python3 +import subprocess +import sys +import os +from pathlib import Path + +SCRIPT_DIR = Path(__file__).parent.absolute() +PROJECT_ROOT = SCRIPT_DIR.parent.parent +SOURCE_REL = SCRIPT_DIR / "тест_бнд_1.квс" + +def clean(): + files = [ + "тест_бнд_1.elf", + "тест_бнд_1.csv", + "тест_бнд_1.аст", + "тест_бнд_1.токены", + "тест_бнд_1.константа", + "тест_бнд_1_pass4.log" + ] + for f in files: + f_path = SCRIPT_DIR / f + if f_path.exists(): + f_path.unlink() + +def build(): + os.chdir(PROJECT_ROOT) + build = subprocess.run(["python3", "kvs_build.py", str(SOURCE_REL)], + capture_output=True, text=True) + if build.returncode != 0: + print(f"❌ Ошибка сборки: {build.returncode}", file=sys.stderr) + print(build.stderr, file=sys.stderr) + return False + return True + +def test_bss_absolute_addressing(): + """Проверка абсолютной адресации в BSS: запись → очистка → чтение""" + print("DEBUG: Тест BSS абсолютной адресации (запись/чтение)", file=sys.stderr) + os.chdir(SCRIPT_DIR) + + elf_path = SCRIPT_DIR / "тест_бнд_1.elf" + if not elf_path.exists(): + print("❌ ELF файл не найден", file=sys.stderr) + return False + + run = subprocess.run([str(elf_path)], capture_output=True, text=True) + + # Ожидаемый код возврата = 0x42 = 66 + expected_code = 66 + + if run.returncode != expected_code: + print(f"❌ Код возврата: ожидался {expected_code} (0x42), получен {run.returncode}", file=sys.stderr) + return False + + print("DEBUG: BSS абсолютная адресация работает: записано и прочитано 0x42", file=sys.stderr) + return True + +def main(): + print("DEBUG: Начало теста тест_бнд_1 (BSS absolute addressing)", file=sys.stderr) + + if not build(): + clean() + sys.exit(1) + + if test_bss_absolute_addressing(): + clean() + print("✅", file=sys.stderr) + sys.exit(0) + else: + clean() + print("❌", file=sys.stderr) + sys.exit(1) + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/тесты/тест_бнд_1/тест_бнд_1.квс b/тесты/тест_бнд_1/тест_бнд_1.квс new file mode 100644 index 0000000..fa07c0d --- /dev/null +++ b/тесты/тест_бнд_1/тест_бнд_1.квс @@ -0,0 +1,32 @@ +; тест_бнд_1.квс +; Полный цикл: запись → очистка → чтение из BSS + +.текст +.глобал _start + +_start: + ; ============================================= + ; ТЕСТ 1: Абсолютная адресация в .бнд (полный цикл) + ; ============================================= + + ; 1. Записываем значение в BSS + переместить_имм рдиай, 0x42 + сохранить [абс_перем], рдиай + + ; 2. Очищаем регистр (чтобы проверить, что значение реально из BSS) + переместить_имм рдиай, 0x00 + + ; 3. Загружаем значение обратно из BSS + загрузить рдиай, [абс_перем] + + ; 4. Выход с кодом = значению из BSS + переместить_имм раикс, 60 + вызов_системы + +.данные +; Заглушка для pass5 (обязательна!) +пустые_данные: .байт 0 + +.бнд +абс_перем: .резб 1 +_запас: .резб 4095 ; гарантирует, что BSS внутри страницы \ No newline at end of file diff --git a/тесты/тест_бнд_2/тест_бнд_2.py b/тесты/тест_бнд_2/тест_бнд_2.py new file mode 100644 index 0000000..d713d96 --- /dev/null +++ b/тесты/тест_бнд_2/тест_бнд_2.py @@ -0,0 +1,74 @@ +#!/usr/bin/env python3 +import subprocess +import sys +import os +from pathlib import Path + +SCRIPT_DIR = Path(__file__).parent.absolute() +PROJECT_ROOT = SCRIPT_DIR.parent.parent +SOURCE_REL = SCRIPT_DIR / "тест_бнд_2.квс" + +def clean(): + files = [ + "тест_бнд_2.elf", + "тест_бнд_2.csv", + "тест_бнд_2.аст", + "тест_бнд_2.токены", + "тест_бнд_2.константа", + "тест_бнд_2_pass4.log" + ] + for f in files: + f_path = SCRIPT_DIR / f + if f_path.exists(): + f_path.unlink() + +def build(): + os.chdir(PROJECT_ROOT) + build = subprocess.run(["python3", "kvs_build.py", str(SOURCE_REL)], + capture_output=True, text=True) + if build.returncode != 0: + print(f"❌ Ошибка сборки: {build.returncode}", file=sys.stderr) + print(build.stderr, file=sys.stderr) + return False + return True + +def test_bss_indirect_addressing(): + """Проверка косвенной адресации в BSS: запись через регистр → очистка → чтение через регистр""" + print("DEBUG: Тест BSS косвенной адресации (запись/чтение через регистр)", file=sys.stderr) + os.chdir(SCRIPT_DIR) + + elf_path = SCRIPT_DIR / "тест_бнд_2.elf" + if not elf_path.exists(): + print("❌ ELF файл не найден", file=sys.stderr) + return False + + run = subprocess.run([str(elf_path)], capture_output=True, text=True) + + # Ожидаемый код возврата = 0x99 = 153 + expected_code = 153 + + if run.returncode != expected_code: + print(f"❌ Код возврата: ожидался {expected_code} (0x99), получен {run.returncode}", file=sys.stderr) + return False + + print("DEBUG: BSS косвенная адресация работает: записано и прочитано 0x99", file=sys.stderr) + return True + +def main(): + print("DEBUG: Начало теста тест_бнд_2 (BSS indirect addressing)", file=sys.stderr) + + if not build(): + clean() + sys.exit(1) + + if test_bss_indirect_addressing(): + clean() + print("✅", file=sys.stderr) + sys.exit(0) + else: + clean() + print("❌", file=sys.stderr) + sys.exit(1) + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/тесты/тест_бнд_2/тест_бнд_2.квс b/тесты/тест_бнд_2/тест_бнд_2.квс new file mode 100644 index 0000000..8be6905 --- /dev/null +++ b/тесты/тест_бнд_2/тест_бнд_2.квс @@ -0,0 +1,36 @@ +; тест_бнд_2.квс +; Полный цикл косвенной адресации через регистр в BSS + +.текст +.глобал _start + +_start: + ; ============================================= + ; ТЕСТ 2: Косвенная адресация в .бнд (полный цикл) + ; ============================================= + + ; 1. Загружаем адрес BSS-переменной в регистр + переместить_имм рбикс, косв_перем + + ; 2. Записываем значение через регистр + переместить_имм рдиай, 0x99 + сохранить [рбикс], рдиай + + ; 3. Очищаем регистр (чтобы доказать, что значение из BSS) + переместить_имм рдиай, 0x00 + + ; 4. Читаем значение обратно через косвенную адресацию + загрузить рдиай, [рбикс] + + ; 5. Выход с кодом = прочитанному значению + переместить_имм раикс, 60 + вызов_системы + +.данные +; Заглушка для pass5 (обязательно!) +пустые_данные: .байт 0 + +.бнд +; Переменная для косвенной адресации +косв_перем: .резб 1 +_запас: .резб 4095 ; страховка от граничных проблем \ No newline at end of file diff --git a/тесты/тест_бнд_3/тест_бнд_3.py b/тесты/тест_бнд_3/тест_бнд_3.py new file mode 100644 index 0000000..c0f337b --- /dev/null +++ b/тесты/тест_бнд_3/тест_бнд_3.py @@ -0,0 +1,78 @@ +#!/usr/bin/env python3 +import subprocess +import sys +import os +from pathlib import Path + +SCRIPT_DIR = Path(__file__).parent.absolute() +PROJECT_ROOT = SCRIPT_DIR.parent.parent +SOURCE_REL = SCRIPT_DIR / "тест_бнд_3.квс" + +def clean(): + files = [ + "тест_бнд_3.elf", + "тест_бнд_3.csv", + "тест_бнд_3.аст", + "тест_бнд_3.токены", + "тест_бнд_3.константа", + "тест_бнд_3_pass4.log" + ] + for f in files: + f_path = SCRIPT_DIR / f + if f_path.exists(): + f_path.unlink() + +def build(): + os.chdir(PROJECT_ROOT) + build = subprocess.run(["python3", "kvs_build.py", str(SOURCE_REL)], + capture_output=True, text=True) + if build.returncode != 0: + print(f"❌ Ошибка сборки: {build.returncode}", file=sys.stderr) + print(build.stderr, file=sys.stderr) + return False + return True + +def test_bss_mixed_addressing(): + """Проверка смешанной адресации в BSS: + - абсолютная запись в абс_перем (0x41) + - косвенная запись в косв_перем (0x11) + - косвенное чтение из абс_перем (должно вернуть 0x41) + """ + print("DEBUG: Тест BSS смешанной адресации (абсолютная + косвенная)", file=sys.stderr) + os.chdir(SCRIPT_DIR) + + elf_path = SCRIPT_DIR / "тест_бнд_3.elf" + if not elf_path.exists(): + print("❌ ELF файл не найден", file=sys.stderr) + return False + + run = subprocess.run([str(elf_path)], capture_output=True, text=True) + + # Ожидаемый код возврата = 0x41 = 65 + expected_code = 65 + + if run.returncode != expected_code: + print(f"❌ Код возврата: ожидался {expected_code} (0x41), получен {run.returncode}", file=sys.stderr) + return False + + print("DEBUG: BSS смешанная адресация работает: прочитано 0x41 из абс_перем через косвенную адресацию", file=sys.stderr) + return True + +def main(): + print("DEBUG: Начало теста тест_бнд_3 (BSS mixed addressing)", file=sys.stderr) + + if not build(): + clean() + sys.exit(1) + + if test_bss_mixed_addressing(): + clean() + print("✅", file=sys.stderr) + sys.exit(0) + else: + clean() + print("❌", file=sys.stderr) + sys.exit(1) + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/тесты/тест_бнд_3/тест_бнд_3.квс b/тесты/тест_бнд_3/тест_бнд_3.квс new file mode 100644 index 0000000..61251dd --- /dev/null +++ b/тесты/тест_бнд_3/тест_бнд_3.квс @@ -0,0 +1,43 @@ +; тест_бнд_3.квс +; Проверяем смешанную адресацию: абсолютная + косвенная + +.текст +.глобал _start + +_start: + ; ============================================= + ; ТЕСТ 3: Микс абсолютной и косвенной адресации + ; ============================================= + + ; === ЧАСТЬ 1: Абсолютная запись === + переместить_имм рдиай, 0x41 + сохранить [абс_перем], рдиай + + ; === ЧАСТЬ 2: Косвенная запись === + переместить_имм рбикс, косв_перем + переместить_имм рдиай, 0x11 + сохранить [рбикс], рдиай + + ; === ЧАСТЬ 3: Смешанное чтение === + ; Очищаем регистры + переместить_имм рдиай, 0x00 + переместить_имм рбикс, 0x00 + + ; Читаем абсолютную переменную через косвенную адресацию + ; (загружаем её адрес в регистр) тут можно менять переменную для теста + переместить_имм рбикс, абс_перем + загрузить рдиай, [рбикс] + + ; Результат: RDI = 0x42 + + ; Выход + переместить_имм раикс, 60 + вызов_системы + +.данные +пустые_данные: .байт 0 + +.бнд +абс_перем: .резб 1 ; 0x403000 65 +косв_перем: .резб 1 ; 0x403001 17 +_запас: .резб 4095 ; страховка от граничных проблем \ No newline at end of file diff --git a/тесты/тест_бнд2.квс b/тесты/черновик/черновик.квс similarity index 94% rename from тесты/тест_бнд2.квс rename to тесты/черновик/черновик.квс index 0d1df2b..17ebe8f 100644 --- a/тесты/тест_бнд2.квс +++ b/тесты/черновик/черновик.квс @@ -1,3 +1,5 @@ +; черновик.квс - для написания тестов + ; НЕ РАБОТАЕТ С НОВЫМ СБОРЩИКОМ .текст