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

138 lines
4.3 KiB
Plaintext
Raw Normal View History

.текст
.глобал _start
_start:
переместить_имм р8, 0 ; число = 0
цикл:
; Выводим число (костыльно: до 99)
сравнить_с р8, 10
переход_если_больше_или_равно двузначное
; Однозначное
переместить раикс, р8
прибавить_непосредственно раикс, 0x30
сохранить [буфер], раикс
переместить_имм раикс, 1
переместить_имм рдиай, 1
переместить_имм рсиай, буфер
переместить_имм рдикс, 1
вызов_системы
переход показать_длину
двузначное:
; Делим на 10
переместить раикс, р8
переместить_имм рдикс, 0
переместить_имм рсикс, 10
разделить рсикс
сохранить [остаток], рдикс
; Десятки
прибавить_непосредственно раикс, 0x30
сохранить [буфер], раикс
переместить_имм раикс, 1
переместить_имм рдиай, 1
переместить_имм рсиай, буфер
переместить_имм рдикс, 1
вызов_системы
; Единицы
загрузить рдикс, [остаток]
прибавить_непосредственно рдикс, 0x30
сохранить [буфер], рдикс
переместить_имм раикс, 1
переместить_имм рдиай, 1
переместить_имм рсиай, буфер
переместить_имм рдикс, 1
вызов_системы
показать_длину:
; Разделитель: " -> "
переместить_имм раикс, 1
переместить_имм рдиай, 1
переместить_имм рсиай, стрелка
переместить_имм рдикс, 4
вызов_системы
; Длина числа
переместить раикс, р8
вызвать длина_числа
прибавить_непосредственно раикс, 0x30
сохранить [буфер], раикс
переместить_имм раикс, 1
переместить_имм рдиай, 1
переместить_имм рсиай, буфер
переместить_имм рдикс, 1
вызов_системы
; Перевод строки
переместить_имм раикс, 1
переместить_имм рдиай, 1
переместить_имм рсиай, nl
переместить_имм рдикс, 1
вызов_системы
; Число++
увеличить р8
сравнить_с р8, 9199
переход_если_меньше цикл
; exit(0)
переместить_имм раикс, 60
переместить_имм рдиай, 0
вызов_системы
; =============================================
; длина_числа
; =============================================
длина_числа:
втолкнуть р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
стрелка:
.строка " -> "
nl:
.байт 0x0A
.бнд
остаток:
.резб 8