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

86 lines
2.8 KiB
Plaintext
Raw Normal View History

.текст
.глобал _start
_start:
переместить_имм р8, 2 ; число = 2
цикл:
; Если число < 10 — выводим как есть
сравнить_с р8, 10
переход_если_больше_или_равно двузначное
; Однозначное: просто цифра
переместить раикс, р8
прибавить_непосредственно раикс, 0x30
сохранить [буфер], раикс
переместить_имм раикс, 1
переместить_имм рдиай, 1
переместить_имм рсиай, буфер
переместить_имм рдикс, 1
вызов_системы
переход продолжение
двузначное:
; Делим на 10
переместить раикс, р8
переместить_имм рдикс, 0
переместить_имм рсикс, 10
разделить рсикс ; rax = десятки, rdx = единицы
; Сохраняем единицы в .бнд (пока не испортились)
сохранить [остаток], рдикс
; Выводим десятки
прибавить_непосредственно раикс, 0x30
сохранить [буфер], раикс
переместить_имм раикс, 1
переместить_имм рдиай, 1
переместить_имм рсиай, буфер
переместить_имм рдикс, 1
вызов_системы
; Загружаем единицы обратно
загрузить рдикс, [остаток]
; Выводим единицы
прибавить_непосредственно рдикс, 0x30
сохранить [буфер], рдикс
переместить_имм раикс, 1
переместить_имм рдиай, 1
переместить_имм рсиай, буфер
переместить_имм рдикс, 1
вызов_системы
продолжение:
; Перевод строки
переместить_имм раикс, 1
переместить_имм рдиай, 1
переместить_имм рсиай, nl
переместить_имм рдикс, 1
вызов_системы
; Прибавляем 2
прибавить_непосредственно р8, 2
; Продолжаем пока <= 99
сравнить_с р8, 99
переход_если_меньше цикл
; exit(0)
переместить_имм раикс, 60
переместить_имм рдиай, 0
вызов_системы
.данные
буфер:
.байт 0, 0, 0, 0, 0, 0, 0, 0
nl:
.байт 0x0A
.бнд
остаток:
.резб 8