вторник, 21 сентября 2010 г.

ASM: Циклы

Для реализации цикла используется сравнение и итератор.

 Пример:

for_start:
mov ecx,0 : инициализируем счетчик ЕСХ
for_loop: : метка для перехода назад
. . . : тело цикла
inc есх : увеличиваем ЕСХ на 1
cmp есх,10 : сравниваем ЕСХ с 10
jnz for_loop : если не равно, переход на for_loop
f o r _ f i n i s h : : если ЕСХ = 10, выходим

Пример с переменной i:

f o r _ s t a r t :
mov dword [i],0 : переменная типа dword 1 = 0
for_loop: : метка для перехода назад
... : тело цикла
inc dword [i] : увеличиваем i на 1
cmp dword [ i ] , 10 : сравниваем i с 10
jnz for_loop : если не равно, переход на for_loop
f o r _ f i n i s h : : если равно, выходим
Однако этот вариант работает медленнее.

Если у вас CISC-процессор, то вам не нужно реализовать цикл самостоятельно — для организации цикла можно использовать команду LOOP:

LOOP метка

for_start:
mov сx, 10 : CX = 10 — 10 итераций
for_loop: : метка для возврата назад
... : тело цикла
loop for_loop : уменьшаем СХ, если не 0, переходим к for_loop
for_finish: : выход из цикла

Цикл со счетчиком и дополнительным условием. Команды LOOPZ и LOOPNZ:

Команда LOOPZ позволяет организовать цикл с проверкой дополнительного
условия. Например: цикл нужно выполнить, не более 10 раз, но только при условии,
что регистр ВХ содержит значение 3. Как только значение в регистре ВХ изменится,
цикл нужно прервать.

LOOPZ метка
LOOPNZ метка

Команда LOOPZ уточняет условие перехода следующим образом: переход
на указанную метку произойдет, если СХ не содержит нуля и в то же время
флаг ZF равен единице. Другое имя этой команды — LOOPE.

Команда LOOPNZ работает аналогично, но дополнительное условие противоположно:
переход будет выполнен только если СХ (ЕСХ) не равен 0 и в то
же время ZF равен 0. Другое имя этой команды — LOOPNE.

Комментариев нет:

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

Примечание. Отправлять комментарии могут только участники этого блога.