148 lines
5.1 KiB
Plaintext
148 lines
5.1 KiB
Plaintext
; ============================================================
|
||
; вывод_числа.квс — исправленный синтаксис деления
|
||
; ============================================================
|
||
|
||
.текст
|
||
.глобал _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 |