From 81813ae2ec9bc1726d516aef54380caac030d157 Mon Sep 17 00:00:00 2001 From: mzhoot Date: Sun, 14 Jun 2026 22:43:01 +0300 Subject: [PATCH] =?UTF-8?q?=D1=82=D0=B5=D1=81=D1=82=D1=8B=20=D1=81=D0=BB?= =?UTF-8?q?=D0=BE=D0=B6=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=B8=20=D0=B2=D1=8B?= =?UTF-8?q?=D1=87=D0=B8=D1=82=D0=B0=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- тесты/kvs_full_test.csv | 5 +- .../вычитание/вычитание.py | 79 +++++++++++++++++ .../вычитание.квс | 22 +++++ .../сложение/сложение.py | 86 +++++++++++++++++++ .../сложение/сложение.квс | 27 ++++++ .../черновик/черновик.квс | 49 +++-------- 6 files changed, 229 insertions(+), 39 deletions(-) create mode 100644 тесты/вычитание/вычитание.py create mode 100644 тесты/вычитание/вычитание.квс create mode 100644 тесты/сложение/сложение.py create mode 100644 тесты/сложение/сложение.квс diff --git a/тесты/kvs_full_test.csv b/тесты/kvs_full_test.csv index b6698ad..5d47440 100644 --- a/тесты/kvs_full_test.csv +++ b/тесты/kvs_full_test.csv @@ -10,4 +10,7 @@ 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 +1;тест_бнд_3;Проверка BSS: смешанная адресация (абсолютная запись + косвенное чтение) +1;сложение;Тест сложения 40+2=42 (проверка через код возврата) +0;сложение+;Тест сложения 40+2=42 (проверка через код возврата+) +1;вычитание;Тест вычитания 50-8=42 \ No newline at end of file diff --git a/тесты/вычитание/вычитание.py b/тесты/вычитание/вычитание.py new file mode 100644 index 0000000..5754885 --- /dev/null +++ b/тесты/вычитание/вычитание.py @@ -0,0 +1,79 @@ +#!/usr/bin/env python3 +# тесты/вычитание/вычитание.py + +import subprocess +import sys +import os + +PROJECT_ROOT = "../../" +SOURCE_REL = "тесты/вычитание/вычитание.квс" + +def clean(): + """Удалить временные файлы""" + files = [ + "вычитание.elf", + "вычитание.csv", + "вычитание.аст", + "вычитание.токены", + "вычитание.константа", + "вычитание_pass4.log" + ] + for f in files: + if os.path.exists(f): + os.remove(f) + +def main(): + print("DEBUG: Начало теста вычитание", file=sys.stderr) + + # Переходим в корень проекта + os.chdir(PROJECT_ROOT) + print(f"DEBUG: Рабочая папка = {os.getcwd()}", file=sys.stderr) + + # 1. Сборка + print("DEBUG: Сборка вычитание.квс", file=sys.stderr) + build = subprocess.run( + ["python3", "kvs_build.py", SOURCE_REL], + capture_output=True, text=True + ) + + if build.returncode != 0: + print(f"❌ Ошибка сборки: {build.returncode}", file=sys.stderr) + print(f"STDERR: {build.stderr}", file=sys.stderr) + sys.exit(1) + + print("DEBUG: Сборка успешна", file=sys.stderr) + + # 2. Переходим в папку теста + os.chdir("тесты/вычитание") + + # 3. Проверка ELF + if not os.path.exists("вычитание.elf"): + print("❌ Файл вычитание.elf не создан", file=sys.stderr) + clean() + sys.exit(1) + + # 4. Запуск + print("DEBUG: Запуск ELF", file=sys.stderr) + run = subprocess.run(["./вычитание.elf"], capture_output=True, text=True) + + print(f"DEBUG: Код возврата = {run.returncode}", file=sys.stderr) + + # 5. Проверка (50 - 12 = 38) + expected = 38 + + if run.returncode == expected: + print(f"✅ Тест пройден: 50 - 12 = {run.returncode}", file=sys.stderr) + clean() + sys.exit(0) + else: + print(f"❌ Тест не пройден: ожидалось {expected}, получено {run.returncode}", file=sys.stderr) + clean() + sys.exit(1) + +if __name__ == "__main__": + main() + +#1;вычитание;Тест вычитания 50-8=42 +#1;вычитание_отрицательное;Тест вычитания с отрицательным результатом +#1;вычитание_память;Тест вычитания через память +#1;вычитание_цепочка;Тест последовательного вычитания \ No newline at end of file diff --git a/тесты/вычитание/вычитание.квс b/тесты/вычитание/вычитание.квс new file mode 100644 index 0000000..9f81e1c --- /dev/null +++ b/тесты/вычитание/вычитание.квс @@ -0,0 +1,22 @@ +; тесты/вычитание/вычитание.квс +; Тест вычитания: 50 - 8 = 42 +.текст +.глобал _start + +_start: + ; Загружаем числа + переместить_имм раикс, 50 + переместить_имм рбикс, 12 + + ; Вычитаем: раикс = раикс - рбикс + вычесть раикс, рбикс + + ; Результат (42) в RDI для exit + переместить рдиай, раикс + + ; Выход + переместить_имм раикс, 60 + вызов_системы + +.данные +_пусто: .байт 0 \ No newline at end of file diff --git a/тесты/сложение/сложение.py b/тесты/сложение/сложение.py new file mode 100644 index 0000000..e53e91a --- /dev/null +++ b/тесты/сложение/сложение.py @@ -0,0 +1,86 @@ +#!/usr/bin/env python3 +import subprocess +import sys +import os + +# Пути относительно папки сложение/ +PROJECT_ROOT = "../../" # корень kvs/ +SOURCE_REL = "тесты/сложение/сложение.квс" +ELF_REL = "тесты/сложение/сложение.elf" + +def clean(): + """Удалить временные файлы после теста""" + files = [ + "сложение.elf", + "сложение.csv", + "сложение.аст", + "сложение.токены", + "сложение.константа", + "сложение_pass4.log" + ] + for f in files: + if os.path.exists(f): + os.remove(f) + print(f"DEBUG: Удалён {f}", file=sys.stderr) + +def main(): + print("DEBUG: Начало теста сложение", file=sys.stderr) + + # Сохраняем текущую директорию + original_dir = os.getcwd() + + # Переходим в корень проекта для сборки + os.chdir(PROJECT_ROOT) + print(f"DEBUG: Рабочая папка = {os.getcwd()}", file=sys.stderr) + + # 1. Сборка (запускаем из корня) + print("DEBUG: Сборка сложение.квс", file=sys.stderr) + build = subprocess.run(["python3", "kvs_build.py", SOURCE_REL], + capture_output=True, text=True) + + if build.returncode != 0: + print(f"❌ Ошибка сборки: {build.returncode}", file=sys.stderr) + print(f"STDERR: {build.stderr}", file=sys.stderr) + print(f"STDOUT: {build.stdout}", file=sys.stderr) + clean() + sys.exit(1) + + print("DEBUG: Сборка успешна", file=sys.stderr) + + # Переходим в папку сложение для запуска + os.chdir("тесты/сложение") + print(f"DEBUG: Запуск в папке {os.getcwd()}", file=sys.stderr) + + # 2. Проверка, что ELF создан + if not os.path.exists("сложение.elf"): + print("❌ Файл сложение.elf не создан", file=sys.stderr) + clean() + sys.exit(1) + + print("DEBUG: ELF файл существует", file=sys.stderr) + + # 3. Запуск и проверка кода возврата + print("DEBUG: Запуск ELF", file=sys.stderr) + run = subprocess.run(["./сложение.elf"], capture_output=True, text=True) + + print(f"DEBUG: Код возврата = {run.returncode}", file=sys.stderr) + print(f"DEBUG: stdout = {repr(run.stdout)}", file=sys.stderr) + print(f"DEBUG: stderr = {repr(run.stderr)}", file=sys.stderr) + + # 4. Проверка результата (42) + expected_code = 42 + + if run.returncode != expected_code: + print(f"❌ Код возврата не совпадает", file=sys.stderr) + print(f" Ожидалось: {expected_code}", file=sys.stderr) + print(f" Получено: {run.returncode}", file=sys.stderr) + clean() + sys.exit(1) + + # Успех + print(f"✅ Тест пройден: {run.returncode} (40+2=42)", file=sys.stderr) + clean() + sys.exit(0) + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/тесты/сложение/сложение.квс b/тесты/сложение/сложение.квс new file mode 100644 index 0000000..3a87319 --- /dev/null +++ b/тесты/сложение/сложение.квс @@ -0,0 +1,27 @@ +; Файл: черновик/черновик.квс +; Тест операции сложения (прибавить) +; Результат должен быть 42 + +.текст +.глобал _start + +_start: + ; Загружаем первое число в регистр + переместить_имм раикс, 40 + + ; Загружаем второе число в другой регистр + переместить_имм рбикс, 2 + + ; Складываем: раикс = раикс + рбикс (40 + 2) + прибавить раикс, рбикс + + ; Результат (42) теперь в RAX + ; Перемещаем результат в RDI (первый аргумент для exit) + переместить рдиай, раикс + + ; Системный вызов exit (код 60) + переместить_имм раикс, 60 + вызов_системы + +.данные +тестовая_переменная: .байт 0 \ No newline at end of file diff --git a/тесты/черновик/черновик.квс b/тесты/черновик/черновик.квс index 17ebe8f..9f81e1c 100644 --- a/тесты/черновик/черновик.квс +++ b/тесты/черновик/черновик.квс @@ -1,49 +1,22 @@ -; черновик.квс - для написания тестов - -; НЕ РАБОТАЕТ С НОВЫМ СБОРЩИКОМ - +; тесты/вычитание/вычитание.квс +; Тест вычитания: 50 - 8 = 42 .текст .глобал _start _start: - ; ============================================= - ; ТЕСТ 1: Абсолютная адресация в .бнд - ; ============================================= - переместить_имм раикс, 0x42 - сохранить [абс_перем], раикс + ; Загружаем числа + переместить_имм раикс, 50 + переместить_имм рбикс, 12 - ; ============================================= - ; ТЕСТ 2: Косвенная адресация в .бнд - ; ============================================= - переместить_имм рбикс, косв_перем - переместить_имм раикс, 0x99 - сохранить [рбикс], раикс + ; Вычитаем: раикс = раикс - рбикс + вычесть раикс, рбикс - ; ============================================= - ; ТЕСТ 3: Ещё одна косвенная адресация в .бнд - ; ============================================= - переместить_имм рсикс, ещё_перем - переместить_имм раикс, 0x77 - сохранить [рсикс], раикс + ; Результат (42) в RDI для exit + переместить рдиай, раикс - ; ============================================= - ; Читаем всё обратно - ; ============================================= - загрузить р8, [абс_перем] - загрузить р9, [рбикс] - загрузить р10, [рсикс] - - ; ============================================= - ; ЗАВЕРШЕНИЕ: возвращаем из абс_перем - ; ============================================= - загрузить рдиай, [абс_перем] + ; Выход переместить_имм раикс, 60 вызов_системы .данные -пустые_данные: .байт 0 - -.бнд -абс_перем: .резб 1 -косв_перем: .резб 1 -ещё_перем: .резб 8 \ No newline at end of file +_пусто: .байт 0 \ No newline at end of file