kvs/тесты/циклы8.квс

180 lines
5.8 KiB
Plaintext
Raw Normal View History

.текст
.глобал _start
_start:
; МЕНЯЙ ЧИСЛО ЗДЕСЬ:
переместить_имм р8, 456777
; Выводим число через itoa3 (до 999!)
переместить раикс, р8
переместить_имм рдиай, буфер
вызвать itoa3
загрузить рсиай, [указатель]
загрузить рдикс, [длина]
переместить_имм раикс, 1
переместить_имм рдиай, 1
вызов_системы
; " -> "
переместить_имм раикс, 1
переместить_имм рдиай, 1
переместить_имм рсиай, стрелка
переместить_имм рдикс, 4
вызов_системы
; Длина числа
переместить раикс, р8
вызвать длина_числа
; Выводим длину
прибавить_непосредственно раикс, 0x30
сохранить [буфер], раикс
переместить_имм раикс, 1
переместить_имм рдиай, 1
переместить_имм рсиай, буфер
переместить_имм рдикс, 1
вызов_системы
; Перевод строки
переместить_имм раикс, 1
переместить_имм рдиай, 1
переместить_имм рсиай, nl
переместить_имм рдикс, 1
вызов_системы
; exit(0)
переместить_имм раикс, 60
переместить_имм рдиай, 0
вызов_системы
; =============================================
; itoa3 — работает для чисел до 999
; =============================================
itoa3:
втолкнуть рбикс
втолкнуть р8
втолкнуть р9
переместить рбикс, рдиай
переместить р8, раикс
сравнить_с р8, 10
переход_если_меньше одна_цифра
сравнить_с р8, 100
переход_если_меньше две_цифры
; Три цифры
прибавить_непосредственно рбикс, 3
переместить раикс, р8
переместить_имм рдикс, 0
переместить_имм р9, 10
разделить р9
прибавить_непосредственно рдикс, 0x30
уменьшить рбикс
сохранить [рбикс], рдикс
переместить р8, раикс
переместить раикс, р8
переместить_имм рдикс, 0
разделить р9
прибавить_непосредственно рдикс, 0x30
уменьшить рбикс
сохранить [рбикс], рдикс
прибавить_непосредственно раикс, 0x30
уменьшить рбикс
сохранить [рбикс], раикс
сохранить [указатель], рбикс
переместить_имм раикс, 3
сохранить [длина], раикс
вытолкнуть р9
вытолкнуть р8
вытолкнуть рбикс
вернуться
две_цифры:
прибавить_непосредственно рбикс, 2
переместить раикс, р8
переместить_имм рдикс, 0
переместить_имм р9, 10
разделить р9
прибавить_непосредственно рдикс, 0x30
уменьшить рбикс
сохранить [рбикс], рдикс
прибавить_непосредственно раикс, 0x30
уменьшить рбикс
сохранить [рбикс], раикс
сохранить [указатель], рбикс
переместить_имм раикс, 2
сохранить [длина], раикс
вытолкнуть р9
вытолкнуть р8
вытолкнуть рбикс
вернуться
одна_цифра:
прибавить_непосредственно раикс, 0x30
сохранить [рбикс], раикс
сохранить [указатель], рбикс
переместить_имм раикс, 1
сохранить [длина], раикс
вытолкнуть р9
вытолкнуть р8
вытолкнуть рбикс
вернуться
; =============================================
; длина_числа
; =============================================
длина_числа:
втолкнуть р8
втолкнуть р9
переместить р8, раикс
переместить_имм р9, 0
сравнить_с р8, 0
короткий_переход_если_неравно длина_цикл
переместить_имм раикс, 1
вытолкнуть р9
вытолкнуть р8
вернуться
длина_цикл:
увеличить р9
переместить раикс, р8
переместить_имм рдикс, 0
переместить_имм рсикс, 10
разделить рсикс
переместить р8, раикс
сравнить_с р8, 0
короткий_переход_если_неравно длина_цикл
переместить раикс, р9
вытолкнуть р9
вытолкнуть р8
вернуться
.данные
буфер:
.байт 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
стрелка:
.строка " -> "
nl:
.байт 0x0A
.бнд
указатель:
.резб 8
длина:
.резб 8