kvs/тесты/вывод_многозначного/вывод_многозначного.квс

81 lines
3.4 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

;./тесты/вывод_многозначного/вывод_многозначного.elf
; Ожидаемый вывод: "12345"
; ============================================================
; вывод_многозначного.квс - вывод многозначного числа
; Преобразует число 12345 в строку через деление на 10 и стек
; ============================================================
.текст
.глобал _start
_start:
; Загружаем число для вывода
переместить_имм раикс, 12345 ; число для преобразования
; Счётчик цифр = 0
переместить_имм р8, 0 ; счётчик цифр в R8
цикл_деления:
; Проверяем, не ноль ли остался
сравнить_с раикс, 0
переход_если_равно вывод_цифр ; если 0 — всё, выводим
; Обнуляем RDX перед делением (старшая часть делимого)
переместить_имм рдикс, 0
; Делим на 10: RAX = частное, RDX = остаток
переместить_имм рбикс, 10
разделить рбикс ; RAX/RBX → RAX(частное), RDX(остаток)
; Преобразуем остаток в ASCII: остаток + '0'
прибавить_непосредственно рдикс, 48 ; RDX = цифра + 48 = ASCII-код
; Сохраняем цифру в стеке
втолкнуть рдикс
; Увеличиваем счётчик
увеличить р8
; Продолжаем цикл (RAX уже содержит частное)
короткий_переход цикл_деления
вывод_цифр:
; Теперь в стеке цифры в обратном порядке, счётчик в R8
; Указатель на буфер в R9
переместить_имм р9, буфер
цикл_вывода:
; Проверяем, все ли цифры вытащили
сравнить_с р8, 0
переход_если_равно готово
; Достаём цифру из стека
вытолкнуть раикс
; Записываем байт в буфер
сохранить [р9], ал
; Сдвигаем указатель буфера
увеличить р9
; Уменьшаем счётчик
уменьшить р8
короткий_переход цикл_вывода
готово:
; Системный вызов write(1, буфер, длина)
переместить_имм раикс, 1 ; номер syscall write = 1
переместить_имм рдиай, 1 ; stdout = 1
переместить_имм рсиай, буфер ; указатель на буфер
переместить_имм рдикс, 5 ; длина = 5 (для 12345)
вызов_системы
; Системный вызов exit(0)
переместить_имм раикс, 60 ; номер syscall exit = 60
переместить_имм рдиай, 0 ; код возврата = 0
вызов_системы
.данные
буфер: .байт 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ; 10 байт с запасом