- Asmworld - http://asmworld.ru -

Учебный курс. Часть 17. Команды LOOPZ и LOOPNZ

Posted By xrnd On 05.05.2010 @ 00:47 In Учебный курс | 17 Comments

Кроме команды LOOP [1] и команд условных переходов существуют ещё две команды, позволяющие организовывать циклы. Это команды LOOPZ [2] (или её синоним LOOPE [2]) и LOOPNZ [3] (синоним — LOOPNE [3]). Действие этих команд очень напоминает LOOP [1], за исключением того, что дополнительно анализируется флаг нуля ZF.

Переход к метке цикла осуществляется в том случае, если после декремента содержимое CX не равно 0 и выполняется условие: ZF=1 (для команды LOOPZ/LOOPE [2]) или ZF=0 (LOOPNZ/LOOPNE [3]).

Эти команды удобно использовать в алгоритмах, где цикл должен завершаться в двух случаях:

  • выполнено требуемое количество итераций;
  • выполнено некоторое условие досрочного завершения цикла.

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
use16                   ;Генерировать 16-битный код
org 100h                ;Программа начинается с адреса 100h
    jmp start           ;Безусловный переход на метку start
;-- Данные ------------------------------------------------------------
string    db 'Hello!',13,10,'$'
length    db 6
s_entchar db 'Enter char (Press ENTER to exit):$'
s_found   db ' - found!',13,10,'$'
s_nfound  db ' - not found!',13,10,'$'
;----------------------------------------------------------------------
start:
    mov ah,09h          ;\
    mov dx,string       ; > Вывод строки
    int 21h             ;/
main:
    mov dx,s_entchar    ;\
    int 21h             ;/ Вывод приглашения для ввода символа
 
    mov ah,01h          ;\
    int 21h             ;/ Ввод символа
    cmp al,0Dh          ;Нажата клавиша ENTER?
    je exit             ;Если да, то переход на метку exit
 
    mov bx,string-1     ;BX = (адрес строки - 1)
    movzx cx,[length]   ;CX = длина строки
search:
    inc bx              ;Инкремент BX
    cmp al,[bx]         ;Сравнение введённого символа с символом строки
    loopne search       ;Цикл, если не равно.
    je found            ;Если равно, то символ найден.
 
    mov dx,s_nfound     ;DX = адрес строки ' - not found!'
print_result:
    mov ah,09h          ;\
    int 21h             ;/ Вывод результата поиска
    jmp main            ;Безусловный переход на метку main
found:
    mov dx,s_found      ;DX = адрес строки ' - found!'
    jmp print_result    ;Безусловный переход на метку print_result
exit:
    mov ax,4C00h        ;\
    int 21h             ;/ Завершение программы

Обратите внимание, изначально в BX загружается значение (адрес строки — 1), так как цикл начинается с команды инкремента. Результат работы программы:

Упражнение

Объявите в программе два массива слов. Размер массивов должен быть одинаков и храниться в 8-битной переменной без знака. Напишите программу сравнения двух массивов, используя команду LOOPZ [2]. (Массивы равны, если все их элементы соответственно равны. Цикл можно завершить, если найдена хотя бы одна пара не совпадающих элементов). Выведите на экран строку, сообщающую о результате сравнения. Сами массивы печатать не нужно. Свои программы можете выкладывать в комментариях.

Следующая часть » [4]


Article printed from Asmworld: http://asmworld.ru

URL to article: http://asmworld.ru/uchebnyj-kurs/017-komandy-loopz-i-loopnz/

URLs in this post:

[1] LOOP: http://asmworld.ru/spravochnik-komand/loop

[2] LOOPZ: http://asmworld.ru/spravochnik-komand/loopz

[3] LOOPNZ: http://asmworld.ru/spravochnik-komand/loopnz

[4] Следующая часть »: http://asmworld.ru/uchebnyj-kurs/018-linejnyj-sdvig/

Copyright © 2009-2010 Asmworld. All rights reserved.