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