Урок 03.
Теперь поступим следующим образом, скопируем полностью урок 2 (папка KOS02) в новый урок (папка KOS03)  и произведём некоторые чистки и преобразования.
Создадим файл MYUnit.asm где будут находится необходимые процедуры и преобразуем из начального файла примера EXAMPLE.ASM. Блок «ЦИКЛ ОБРАБОТКИ СОБЫТИЙ», преобразуем в процедуру «CycleProcesEvents», которая будет находится в файле MYUnit.asm.
Теперь попробуем написать программу которая будет выводить прямоугольники разных цветов через определённое время, используя задержку.
Для этого нам нужно написать процедуру задержки и код который будет менять цвета прямоугольников. Но.... как это всё написать ?!... толком не зная команд ассемблера ?!
Дельфи то мы знаем! :-) Создадим файл vs1.dpr в котором напишем следующее:
Var a:Cardinal;
Begin
  a:=0;
Repeat
   a:=a+1;
until a>= 1000000;
end.

Это и будет код задержки.
Откроем в Дельфи и запустим его буквально на один шаг (кл. F7 или меню: Run\Trace info), далее сделаем просмотр нашего кода, в маш.кодах, на языке ассмеблера (кл. Ctrl+Alt+C или меню: View\Debug windows\CPU), и вот мы видим код который будет исполняться, причём с метками на строки дельфи и команд дельфи, выглядит это приблизительно так:
…........................
vs1.dpr.3: a:=0;
0040376C 33C0             xor eax,eax
vs1.dpr.5: a:=a+1;
0040376E 40               inc eax
vs1.dpr.6: until a>= 10000000;
0040376F 3D40420F00       cmp eax,$00989680
00403774 72F8             jb -$08
vs1.dpr.8: end.
….....................
Скопируем данный код и
убрав всё не нужное, т. е. адресацию и коды команд, закомментировав «строки дельфи», мы получает слуедующее:
;vs1.dpr.3: a:=0;
xor eax,eax
;vs1.dpr.5: a:=a+1;
inc eax
;vs1.dpr.6: until a>= 10000000;
cmp eax,$00989680
jb -$08
;vs1.dpr.8: end.

Если применять в Fasm конструкци подобные « jb -$08», то при запуске программы будет выдана ошибка. Не вникая в подробности, узнав или поняв, что команда « jb» является командой перехода, заменим её вот так вот «jb Repeat_». Где «Repeat_» будет указывать метку,  куда надо делать переход. А куда надо делать переход, -  догадаться не сложно.

Также создадим часть кода которая будет менять цветовую заливку прямоугольника. Из кода который выше не сложно догадаться как сделать блок который будет менять цветовую гамму путём прибавления какого-то числа к «цвету». Но для этого нам надо зарезервировать переменную, для хранения того числа («Цвета»).  И вот узнаем, что резервирование делается директивами «rb», «rd» и т.д. В зависимости от типа переменной. Переменную нужно использовать подходящую для «цвета» и для регистров процессора с которыми мы будем работать передавая «цвет» в сис.функцию 13  ( edx = цвет).
Разметка одной, 4-байтовой переменной делается так: «Color: rd 1».
И вот какой код у нас получится:
….........
Color: rd 1; метка на переменую
................
mov edx,[Color] ;   edx= Color
add edx, $00123456 ; edx=edx+$00123456
mov [Color],edx ; Color= edx
...................

И далее применяем edx для сис.функици 13.

Рассмотрите пример урока и поэксперепентируйте с ним.
Этим уроком, основное, что я хотел показать, это то, что можно использовать среду подобную Дельфи или другую среду, в которой есть возможность просмотра и копирования результирующего исполнительного кода, для понимания языка ассемблера и применения результатов той компиляции среды в FASM.

Примечание. Данный код процедуры задержки, является всего лишь наглядным примером использования команд ассемблера и такую процедуру не рекомендуется применять в дальнейшем, так как она не будут считается корректной, если её применять в программах и проектах.

Пример урока 03 можно скачать здесь:  https://cloud.mail.ru/public/2tjn/dvXkKYLSv
( https://cloud.mail.ru/public/12cZ/TQKhzi1un )
Примеры всех уроков здесь: https://cloud.mail.ru/public/2C7X/GTGtwqmJy
( https://cloud.mail.ru/public/AYNK/jmtnJw9C3 )