Ассембли. Урок II - Циклы и условные переходы
Привет. Сегодня поговорим о циклах и условных переходах. Для этого давайте возьмём код из первого урока и немного его усложним, добавив сначала цикл, затем условный переход. Давайте сделаем так чтобы окошко вызывалось 5 раз. Для этого приведём следующий код:
include 'D:\FASM\include\win32ax.inc'
.code
start:
mov esi,5d ; кладём в регистр esi число 5
@@loop: ; обьявили метку
invoke MessageBox,0,0,0,0 ; вызываем окно
dec esi ; уменьшаем счётчик
cmp esi,0 ; сравниваем esi c нулём (проверяем не кончился ли счётчик)
ja @@loop ; и если число в esi превышает 0 (нуль) то прыгаем на метку @@loop
invoke ExitProcess,0 ; ну а если равно то выходим из программы
.end start
Тут наверное стоит пояснить что метка @@loop - так написанна для удобства и только для этого. Есть ещё понятие анонимных меток - о них мы поговорим в следующих уроках. Итак из комментариев в коде я думаю всё ясно. Мы просто обьявили регистр esi как счётчик, затем мы вызываем окошко и уменьшаем счётчик на 1 (dec - уменьшить на 1). Сравниваем счётчик с нулём, так мы проверяем, не кончился ли счётчик, и если не кончился - переходим на метку @@loop. Поясню, что JA - Jump if Above то есть переход если больше. Так и получаеться что пока в esi больше нуля то мы "бегаем по коду" и выполняем вызов окна. Как только счётчик установлен в 0 (нуль) - выполнение программы прекращаеться, то есть выполняеться ExitProcess.
Кстати в этой программе мы использовали и цикл и условный переход. Но давайте превратим этот код в более привычный вид для программистов на C++ и Delphi:
include 'D:\FASM\include\win32ax.inc'
.code
start:
mov esi,5d
@@loop:
invoke MessageBox,0,0,0,0
dec esi
.if esi = 0
invoke ExitProcess,0
.endif
jmp @@loop
.end start
Тут уже попонятнее да? Появился привычный нам всем if. Как вы уже знаете после if выполняеться код если условие верно. То есть если у нас esi = 0, то выполняеться ExitProcess. Тут всё понятно и так.