Показать сообщение отдельно

  #3  
Старый 13.08.2008, 01:02
luz3r
Banned
Регистрация: 23.02.2008
Сообщений: 268
Провел на форуме:
3103600

Репутация: 850
Post

Ассембли. Урок 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. Тут всё понятно и так.
 
Ответить с цитированием