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