Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лекции / СПО2.doc
Скачиваний:
114
Добавлен:
11.02.2014
Размер:
527.87 Кб
Скачать

28. Логика и организация циклических вычислений с помощью команды loop

Команда LOOP.Команда JMP в предыдущем примере реализует бесконечный цикл. Но более вероятно подпрограмма должна выполнять определенное число циклов. Команда LOOP, которая служит для этой цели, использует начальное значение в регистре CX. В каждом цикле команда LOOP автоматически уменьшает содержимое регистра CX на 1. Пока значение в CX не равно нулю, управление передается по адресу, указанному в операнде, и если в CX будет 0, управление переходит на слудующую после LOOP команду.

В следующем примере показана процедура, иллюстрирующая использование команды LOOP, она выполняет действия, аналогичные предыдущему примеру за исключением того, что после десяти циклов программа завершается. Команда MOV инициализирует регистр CX значением 10. Так как команда LOOP использует регистр CX, то в программе для удвоения начального значения 1 вместо регистра CX используется DX. Команда JMP A20 заменена командой LOOP и для эффективности команда ADD AX,01 заменена командой INC AX (увеличение AX на 1).

Аналогично команде JMP, операнд команды LOOP определяет расстояние от конца команды LOOP до адреса метки A20, которое прибавляется к содержимому командного указателя. Для команды LOOP это расстояние должно быть в пределах от -128 до +127 байт. Если операнд превышает эти границы, то ассемблер выдаст сообщение "Relative jump out of range" (превышены границы перехода).

0100 BEGIN PROC NEAR

0100 B8 0001 MOV AX,01 ;Инициализация AX,

0103 BB 0001 MOV BX,01 ; BX,

0106 BA 0001 MOV DX,01 ; и DX

0109 B9 000A MOV CX,10 ;Число циклов

010C A20:

010C 40 INC AX ;Прибавить 01 к AX

010D 03 D8 ADD BX,AX ;Прибавить AX к BX

010F D1 E2 SHL DX,1 ;Удвоить DX

0111 E2 F9 LOOP A20 ;Уменьшить CX и

; повторить цикл, если ненуль

0113 C3 RET ;Завершить работу

0114 BEGIN ENDP

Команды логических операций

Логические операции являются важным элементом в проектировании микросхем и имеют много общего в логике программирования. Команды AND, OR, XOR и TEST - являются командами логических операций. Эти команды используются для сброса и установки бит и для арифметических операций в коде ASCII . Все эти команды обрабатывают один байт или одно слово в регистре или в памяти, и устанавливают флаги CF, OF, PF, SF, ZF.

AND: Если оба из сравниваемых битов равны 1, то результат равен 1; во всех остальных случаях результат - 0.

OR: Если хотя бы один из сравниваемых битов равен 1, то результат равен 1; если сравниваемые биты равны 0, то результат - 0.

XOR: Если один из сравниваемых битов равен 0, а другой равен 1, то результат равен 1; если сравниваемые биты одинаковы (оба - 0 или оба - 1) то результат - 0.

TEST: действует как AND-устанавливает флаги, но не изменяет биты.

Первый операнд в логических командах указывает на один байт или слово в регистре или в памяти и является единственным значением, которое может изменятся после выполнения команд. В следующих командах AND, OR и XOR используются одинаковые битовые значения:

AND OR XOR

0101 0101 0101

0011 0011 0011

Результат: 0001 0111 0110

Для следующих несвязанных примеров, предположим, что AL содержит 1100 0101, а BH содержит 0101 1100:

1. AND AL,BH ;Устанавливает в AL 0100 0100

2. OR BH,AL ;Устанавливает в BH 1101 1101

3. XOR AL,AL ;Устанавливает в AL 0000 0000

4. AND AL,00 ;Устанавливает в AL 0000 0000

5. AND AL,0FH ;Устанавливает в AL 0000 0101

6. OR CL,CL ;Устанавливает флаги SF и ZF

Примеры 3 и 4 демонстрируют способ очистки регистра. В примере 5 обнуляются левые четыре бита регистра AL. Хотя команды сравнения CMP могут быть понятнее, можно применить команду OR для следующих целей:

1. OR CX,CX ;Проверка CX на нуль

JZ ... ;Переход, если нуль

2. OR CX,CX ;Проверка знака в CX

JS ... ;Переход, если отрицательно

Команда TEST действует аналогично команде AND, но устанавливает только флаги, а операнд не изменяется.

Еще одна логическая команда NOT устанавливает обpатное значение бит в байте или в слове, в регистре или в памяти: нули становятся единицами, а единицы - нулями. Если, например, pегистр AL содержит 1100 0101, то команда NOT AL изменяет это значение на 0011 1010. Флаги не меняются. Команда NOT не квивалентна команде NEG, которая меняет значение с положительного на отрицательное и наоборот, посредством замены бит на противоположное значение и прибавления единицы

Ниже приведён пример программы, считающей количество положительных элементов массива. Сегмент данных содержит поле titl с элементами массива. В регистр CX заносится кoличество элементов, а регистр DX обнуляется для счёта положительных элементов. Команда LEA загружает относительный адрес поля titl в регистр BX и использует его для пересылки элементов массива в регистр AL, в котором происходит проверка знака данного элемента массива. Далее выбирается следуюший элемент из поля titl и процедура повторяется. По окончании цикла в регистре DX будет значение положительных элементов массива.

1 0000 wert segment para 'code'

2 assume cs:wert;ss:wert;ds:wert

3 org 100h

4 0100 ad: jmp asd

5 0103 03 05 FE 07 08 0C 01+ titl DB 3,5,-2,7,8,12,1,-3,-9,-18

6 FD F7 EE

7 010D asd proc

8 010D B9 000A mov cx,10 ; счётчик

9 0110 BA 0000 mov dx,0000 ; результат

10 0113 BB 0101г lea bx,titl ; адрес titl в BX

11 0116 BA 07 m1: mov al,[bx] ; 1 элемент в AL

12 0118 0A C0 or al,al ; меньше 0 ?

13 011A 78 01 js m2 ; Да – на m2

14 011C 42 inc dx ; Нет - DX+1

15 011D 43 m2: inc bx ; titl+1(следующий)

16 011E E2 F6 loop m1 ; повторить

17 0120 C3 ret

18 0121 asd endp

19 0121 wert ends

20 end ad

Соседние файлы в папке лекции