DevProg: Блог для программистов

Секреты программирования. Примеры разработки. Обзоры программёрского софта, блогов и форумов и просто полезные советы!

Ассемблер для начинающих. Урок 2 — Циклы и условные переходы

Posted by devprog на 21 октября, 2008

ассемблер для новичковПривет. Сегодня поговорим о циклах и условных переходах. Для этого давайте возьмём код из первого урока и немного его усложним, добавив сначала цикл, затем условный переход. Давайте сделаем так чтобы окошко вызывалось 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. Тут всё понятно и так. Если не понятно — всегда рад ответить на ваши вопросы.

И вот только сейчас я вспомнил что я обещал на прошлом уроке показать как использовать переменные среды. Но я не буду этого делать. А почему? Да потому что я нашёл видео по этому делу:

http://sulaiman.netadvant.com/video/fasm-05.rar . Но для его просмотра нужно скачать кодек: http://sulaiman.netadvant.com/video/….0.0-13124.exe

комментариев 7 to “Ассемблер для начинающих. Урок 2 — Циклы и условные переходы”

  1. Kerny said

    ООО клева!!! А есть ли еще способы организации циклов?

  2. Дмитрий said

    А продолжение будет?

  3. Евгений said

    А как понимать метки, которые я встречал? например @F …….какой-то код ….. @@: Что это, ведь имена не совпадают. Если пишешь обучалку, тем более для начинающих, такие вещи надо учитывать и объяснять.

  4. devprog said

    Евгений разные метки потому, что после каждой метки идет код, который будет выполняться, если вызвана команда прыжка на него, например jmp [название метки] будет выполнять код метки.

  5. Rava said

    Вот бы на лекциях такие объяснения… Подписался на Follow. Спасибо автору!

  6. devprog said

    Rava, спасибо за теплые слова, будут вопросы по асму, пиши, рад буду помочь.

  7. nikon1963 said

    использовать регистр-указатель не рацционально, лучше использовать предназначенный для этих операций регистр ЕСХ.

Оставьте комментарий