тест остатк от деления на 10

This commit is contained in:
mzhoot 2026-06-28 11:50:50 +03:00
parent 309bbd460a
commit 70ed97cec6
5 changed files with 286 additions and 16 deletions

View file

@ -22,4 +22,5 @@
1;тест_адресации_р15;Проверка косвенной адресации через R15 (ASCII код первого символа аргумента)
1;двоеточие_в_строке;Проверка обработки строк с двоеточием внутри
1;тест_адресации_р12;Проверка косвенной адресации через R12 (ASCII код первого символа аргумента)
1;вызов_функции;Проверка вызова функций и возврата: сложение 10+20=30 через код возврата
1;вызов_функции;Проверка вызова функций и возврата: сложение 10+20=30 через код возврата
1;остаток_от_деления;Проверка деления и получения остатка: 42 % 10 = 2 (проверка через код возврата)
Can't render this file because it contains an unexpected character in line 2 and column 46.

View file

@ -0,0 +1,117 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Тест для проверки операции деления и получения остатка
Запускает скомпилированную программу и проверяет код возврата
Ожидаемый результат: 42 % 10 = 2
"""
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 / "остаток_от_деления.квс"
def clean():
"""Очищает артефакты сборки"""
files = [
"остаток_от_деления.elf",
"остаток_от_деления.csv",
"остаток_от_деления.аст",
"остаток_от_деления.токены",
"остаток_от_деления.константа",
"остаток_от_деления_pass4.log"
]
for f in files:
f_path = SCRIPT_DIR / f
if f_path.exists():
f_path.unlink()
print(f"DEBUG: Удалён {f}", file=sys.stderr)
def build() -> bool:
"""
Собирает тестовую программу с помощью КВС
Returns:
bool: True если сборка успешна, иначе False
"""
print(f"DEBUG: Сборка {SOURCE_REL}", file=sys.stderr)
os.chdir(PROJECT_ROOT)
build = subprocess.run(
["python3", "квс_сборка.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
print("DEBUG: Сборка успешна", file=sys.stderr)
return True
def test_division_remainder() -> bool:
"""
Запускает скомпилированную программу и проверяет код возврата
42 % 10 = 2
Returns:
bool: True если код возврата = 2, иначе False
"""
print("DEBUG: Запуск ELF, ожидается код возврата 2", file=sys.stderr)
os.chdir(SCRIPT_DIR)
elf_path = SCRIPT_DIR / "остаток_от_деления.elf"
if not elf_path.exists():
print("❌ ELF файл не найден", file=sys.stderr)
return False
# Запускаем программу без аргументов
run = subprocess.run(
[str(elf_path)],
capture_output=True,
text=True
)
expected_code = 2 # 42 % 10 = 2
if run.returncode != expected_code:
print(f"❌ Код возврата: ожидался {expected_code}, получен {run.returncode}", file=sys.stderr)
if run.stderr:
print(f" stderr: {run.stderr}", file=sys.stderr)
if run.stdout:
print(f" stdout: {run.stdout}", file=sys.stderr)
return False
print(f"DEBUG: Тест пройден (код {run.returncode})", file=sys.stderr)
return True
def main():
"""Главная функция теста"""
print("DEBUG: Начало теста остаток_от_деления", file=sys.stderr)
# Собираем программу
if not build():
clean()
sys.exit(1)
# Запускаем тест
if not test_division_remainder():
clean()
sys.exit(1)
# Очищаем артефакты
clean()
print("Все тесты пройдены!", file=sys.stderr)
sys.exit(0)
if __name__ == "__main__":
main()

View file

@ -0,0 +1,35 @@
;./тесты/остаток_от_деления/остаток_от_деления.elf
;echo $? # должен быть 2
;для вывода чисел в терминал нужно преобразование в строку
;а для этого нужен остаток от деления (но тут надо бы больше случаев отработать)
; ============================================================
; остаток_от_деления.квс - тест операции деления и остатка
; Проверяем: 42 / 10 = 4 остаток 2
; ============================================================
.текст
.глобал _start
_start:
; Подготовка делимого: RDX:RAX = 0:42
переместить_имм раикс, 42 ; делимое = 42
переместить_имм рдикс, 0 ; обнуляем RDX (старшая часть 128-битного делимого)
; Делитель в регистр
переместить_имм рбикс, 10 ; делитель = 10
; Выполняем деление: RDX:RAX / RBX
; После деления: RAX = частное (4), RDX = остаток (2)
разделить рбикс
; Перемещаем остаток в RDI для кода возврата
переместить рдиай, рдикс ; остаток из RDX в RDI
; Системный вызов exit
переместить_имм раикс, 60 ; номер syscall exit = 60
вызов_системы
.данные
тестовая_переменная: .байт 0

View file

@ -1,4 +1,3 @@
; Файл: черновик/черновик.квс
; Тест операции сложения (прибавить)
; Результат должен быть 42

View file

@ -1,30 +1,148 @@
; ============================================================
; вывод_числа.квс — исправленный синтаксис деления
; ============================================================
.текст
.глобал _start
_start:
; Вызов функции с двумя аргументами
переместить_имм рдиай, 10 ; первый аргумент = 10
переместить_имм рсиай, 20 ; второй аргумент = 20
вызвать сложить_два_числа
переместить_имм раикс, -12345
вызвать вывести_число
; Результат в RAX — используем как код возврата
переместить рдиай, раикс ; первый аргумент sys_exit = результат
переместить_имм раикс, 60 ; sys_exit
; Вывод перевода строки
переместить_имм раикс, 1
переместить_имм рдиай, 1
переместить_имм рсиай, новая_строка
переместить_имм рдикс, 1
вызов_системы
; Завершение
переместить_имм раикс, 60
переместить_имм рдиай, 0
вызов_системы
сложить_два_числа:
; Пролог
вывести_число:
втолкнуть рбипи
переместить рбипи, рсипи
; Тело функции: сложить аргументы
прибавить рдиай, рсиай ; RDI += RSI
переместить раикс, рдиай ; результат в RAX
втолкнуть рбикс
втолкнуть рсикс
втолкнуть рдикс
втолкнуть р8
втолкнуть р9
втолкнуть р10
втолкнуть р11
; ---- Проверка на отрицательное ----
проверить раикс, раикс
переход_если_больше_или_равно _положительное
втолкнуть раикс
переместить_имм раикс, 1
переместить_имм рдиай, 1
переместить_имм рсиай, минус_символ
переместить_имм рдикс, 1
вызов_системы
вытолкнуть раикс
отрицать раикс
_положительное:
; ---- Сохраняем число в R8 ----
переместить р8, раикс
переместить_имм р9, 0
; ---- Устанавливаем R10 на КОНЕЦ буфера (буфер + 19) ----
переместить_имм р10, буфер
увеличить р10
увеличить р10
увеличить р10
увеличить р10
увеличить р10
увеличить р10
увеличить р10
увеличить р10
увеличить р10
увеличить р10
увеличить р10
увеличить р10
увеличить р10
увеличить р10
увеличить р10
увеличить р10
увеличить р10
увеличить р10
увеличить р10
; Записываем нуль-терминатор
переместить_имм [р10], 0
; ---- Особый случай: число = 0 ----
проверить р8, р8
переход_если_равнооль_особый_случай
_цикл_деления:
проверить р8, р8
переход_если_равно _вывод_числа
; ---- ДЕЛЕНИЕ (исправленный синтаксис) ----
переместить_имм рдиай, 0 ; RDX = 0
переместить раикс, р8 ; RAX = R8
переместить_имм рсиай, 10 ; RSI = 10
разделить рдиай, раикс, рсиай ; ← ИСПРАВЛЕНО!
; ---- Сохраняем результат ----
переместить р8, раикс ; R8 = частное
прибавить рдиай, '0' ; RDX = цифра + '0'
уменьшить р10 ; двигаем указатель влево
сохранить [р10], дил ; сохраняем байт
увеличить р9 ; счётчик цифр++
переход _цикл_деления
оль_особый_случай:
; Если число = 0, записываем '0' в начало буфера
переместить_имм [буфер], '0'
переместить_имм р10, буфер
переместить_имм р9, 1
переход _вывод_числа
_вывод_числа:
переместить рсиай, р10
переместить рдикс, р9
вызвать вывести_строку
вытолкнуть р11
вытолкнуть р10
вытолкнуть р9
вытолкнуть р8
вытолкнуть рдикс
вытолкнуть рсикс
вытолкнуть рбикс
переместить рсипи, рбипи
вытолкнуть рбипи
вернуться
вывести_строку:
втолкнуть рбипи
переместить рбипи, рсипи
втолкнуть раикс
втолкнуть рдиай
переместить_имм раикс, 1
переместить_имм рдиай, 1
вызов_системы
вытолкнуть рдиай
вытолкнуть раикс
; Эпилог
переместить рсипи, рбипи
вытолкнуть рбипи
вернуться
.данные
тестовая_переменная: .байт 0
минус_символ: .байт '-'
новая_строка: .байт 10
.бнд
буфер: .резб 20