kvs/тесты/черновик/черновик.квс

148 lines
5.1 KiB
Plaintext
Raw Permalink 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.

; ============================================================
; вывод_числа.квс — исправленный синтаксис деления
; ============================================================
.текст
.глобал _start
_start:
переместить_имм раикс, -12345
вызвать вывести_число
; Вывод перевода строки
переместить_имм раикс, 1
переместить_имм рдиай, 1
переместить_имм рсиай, новая_строка
переместить_имм рдикс, 1
вызов_системы
; Завершение
переместить_имм раикс, 60
переместить_имм рдиай, 0
вызов_системы
вывести_число:
втолкнуть рбипи
переместить рбипи, рсипи
втолкнуть рбикс
втолкнуть рсикс
втолкнуть рдикс
втолкнуть р8
втолкнуть р9
втолкнуть р10
втолкнуть р11
; ---- Проверка на отрицательное ----
проверить раикс, раикс
переход_если_больше_или_равно _положительное
втолкнуть раикс
переместить_имм раикс, 1
переместить_имм рдиай, 1
переместить_имм рсиай, минус_символ
переместить_имм рдикс, 1
вызов_системы
вытолкнуть раикс
отрицать раикс
_положительное:
; ---- Сохраняем число в R8 ----
переместить р8, раикс
переместить_имм р9, 0
; ---- Устанавливаем R10 на КОНЕЦ буфера (буфер + 19) ----
переместить_имм р10, буфер
увеличить р10
увеличить р10
увеличить р10
увеличить р10
увеличить р10
увеличить р10
увеличить р10
увеличить р10
увеличить р10
увеличить р10
увеличить р10
увеличить р10
увеличить р10
увеличить р10
увеличить р10
увеличить р10
увеличить р10
увеличить р10
увеличить р10
; Записываем нуль-терминатор
переместить_имм [р10], 0
; ---- Особый случай: число = 0 ----
проверить р8, р8
переход_если_равнооль_особый_случай
_цикл_деления:
проверить р8, р8
переход_если_равно _вывод_числа
; ---- ДЕЛЕНИЕ (исправленный синтаксис) ----
переместить_имм рдиай, 0 ; RDX = 0
переместить раикс, р8 ; RAX = R8
переместить_имм рсиай, 10 ; RSI = 10
разделить рдиай, раикс, рсиай ; ← ИСПРАВЛЕНО!
; ---- Сохраняем результат ----
переместить р8, раикс ; R8 = частное
прибавить рдиай, '0' ; RDX = цифра + '0'
уменьшить р10 ; двигаем указатель влево
сохранить [р10], дил ; сохраняем байт
увеличить р9 ; счётчик цифр++
переход _цикл_деления
оль_особый_случай:
; Если число = 0, записываем '0' в начало буфера
переместить_имм [буфер], '0'
переместить_имм р10, буфер
переместить_имм р9, 1
переход _вывод_числа
_вывод_числа:
переместить рсиай, р10
переместить рдикс, р9
вызвать вывести_строку
вытолкнуть р11
вытолкнуть р10
вытолкнуть р9
вытолкнуть р8
вытолкнуть рдикс
вытолкнуть рсикс
вытолкнуть рбикс
переместить рсипи, рбипи
вытолкнуть рбипи
вернуться
вывести_строку:
втолкнуть рбипи
переместить рбипи, рсипи
втолкнуть раикс
втолкнуть рдиай
переместить_имм раикс, 1
переместить_имм рдиай, 1
вызов_системы
вытолкнуть рдиай
вытолкнуть раикс
переместить рсипи, рбипи
вытолкнуть рбипи
вернуться
.данные
минус_символ: .байт '-'
новая_строка: .байт 10
.бнд
буфер: .резб 20