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

81 lines
3.4 KiB
Plaintext
Raw Normal View History

;./тесты/вывод_многозначного/вывод_многозначного.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 байт с запасом