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 байт с запасом
|