Команды переходов для чисел без знака
Instruction | Description | Condition | Opposite Instruction |
JE , JZ | Jump if Equal (=). Jump if Zero. | ZF = 1 | JNE, JNZ |
JNE , JNZ | Jump if Not Equal (<>). Jump if Not Zero. | ZF = 0 | JE, JZ |
JA , JNBE | Jump if Above (>). Jump if Not Below or Equal (not <=). | CF = 0 and ZF = 0 | JNA, JBE |
JB , JNAE, JC | Jump if Below (<). Jump if Not Above or Equal (not >=). Jump if Carry. | CF = 1 | JNB, JAE, JNC |
JAE , JNB, JNC | Jump if Above or Equal (>=). Jump if Not Below (not <). Jump if Not Carry. | CF = 0 | JNAE, JB |
JBE , JNA | Jump if Below or Equal (<=). Jump if Not Above (not >). | CF = 1 or ZF = 1 | JNBE, JA |
Вообще, когда это требуется, чтобы сравниться, числовая команда значений CMP используется (это делает тот же самый как SUB (вычитает) команда, но не сохраняет результат, только воздействует на флажки).
Логика очень проста, например:
Это требуется, чтобы сравниться 5 и 2, 5 - 2 = 3
Результат - не ноль (Нулевой Флажок установлен в 0).
Другой пример:
Это требуется, чтобы сравниться 7 и 7, 7 - 7 = 0
Результат нулевой! (Нулевой Флажок установлен в 1 и JZ, или JE будет делать переход).
Имеется пример команды CMP и условного перехода:
include emu8086.incORG 100h MOV AL, 25 ; set AL to 25.MOV BL, 10 ; set BL to 10. CMP AL, BL ; compare AL - BL. JE equal ; jump if AL = BL (ZF = 1). PUTC 'N' ; if it gets here, then AL <> BL,JMP stop ; so print 'N', and jump to stop. equal: ; if gets here,PUTC 'Y' ; then AL = BL, so print 'Y'.stop:RET ; gets here no matter what.END
Пробуйте вышеупомянутый пример с различными числами для AL и BL, открытые флажки, нажимая по кнопке [FLAGS], использование [Single Step], и см. то, что случается, не забудьте повторно собирать и перезагружать после каждого изменения (чтобы использовать кнопку F5).
Все условные переходы имеют одно большое ограничение, в отличие от команды JMP, они могут только переходить на 127 байтов вперед и 128 байтов назад (обратите внимание, что большинство команд собрано в 3 или большее количество байтов).
Мы можем легко избегать этого ограничения, используя симпатичную уловку:
· Получите противоположную условную команду перехода от таблицы выше, заставите этот переход к label_x.
· Команда JMP Использования, чтобы перейти, чтобы изменить местоположения.
· Определите label_x: только после команды JMP.
Label_x: - может быть любое допустимое имя метки.
Имеется пример:
include emu8086.incORG 100h MOV AL, 25 ; set AL to 25.MOV BL, 10 ; set BL to 10. CMP AL, BL ; compare AL - BL. JNE not_equal ; jump if AL <> BL (ZF = 0).JMP equalnot_equal: ; let's assume that here we; have a code that is assembled; to more then 127 bytes... PUTC 'N' ; if it gets here, then AL <> BL,JMP stop ; so print 'N', and jump to stop. equal: ; if gets here,PUTC 'Y' ; then AL = BL, so print 'Y'. stop:RET ; gets here no matter what.END
Другой, все же редко используемый метод обеспечивает непосредственное значение вместо метки. Когда непосредственное значение начинается с '$' символьным относительным переходом, выполнен, иначе компилятор вычисляет команду, которая переходит непосредственно к данному смещению. Например:
ORG 100h; unconditional jump forward: skip over next 2 bytes,JMP $2a DB 3 ; 1 byte.b DB 4 ; 1 byte. ; JCC jump back 7 bytes:; (JMP takes 2 bytes itself)MOV BL,9DEC BL ; 2 bytes.CMP BL, 0 ; 3 bytes.JNE $-7RETENDВо многих случаях при выполнении программ необходимо проверять или изменять (маскировать) состояние одного или нескольких разрядов числа в аккумуляторе. Это можно осуществить с помощью следующих операций:
1) логического умножения числа в аккумуляторе и маски, которое очищает разряд числа, если в соответствующем разряде маски будет записан 0, и не изменяет его, если в разряде маски записана 1;
логического сложения числа в аккумуляторе и маски, которое устанавливает разряд числа в 1, если в таком же разряде маски будет записана 1, и не изменяет его, если в этом разряде записан 0;
3) логического «исключающего ИЛИ» числа в аккумуляторе и маски, которое инвертирует содержание разряда числа, если в соответствующем разряде маски записана 1, и не изменяет его, если в этом разряде записан 0. Примеры использования этих команд приведены в табл. 8.2.
Таблица 8.2
Мнемокод | Машинный код | Число в аккумуляторе | Маска | Комментарий | Результат в аккумуляторе |
ANI<D1> | E6<D1> | 00111010 11111111 00000000 10101010 11110000 00001111 00100010 | Логическое умножение содержимого аккумулятора с байтом D1 | 00101000 00100010 00000000 00100010 11110000 00001111 00000000 | |
0RI<D1> | F6<D1> | 00111010 00001111 11110000 | 10101100 00001111 00001111 | Логическое сложение содержимого аккумулятора с байтом D1 | |
XRI<D1> | EF<D1> | 00111010 00001111 11110000 | 10101100 00001111 00001111 | Логическое «исключающее ИЛИ» содержимого аккумулятора с байтом D1 |
Проведение логических операций возможно также с содержимым аккумулятора и внутренними регистрами МП 8086. В этом случае команды однобайтны.1. При выполнении всех логических команд задействуют разряды регистра признаков. Это позволяет проверять состояние любого разряда числа и выполнять условные переходы в программах. Программа маскирования отдельных разрядов числа (программа 8.7), записанного во входном устройстве, приведена ниже. Программа помещает результат маскирования в выходное устройство.
Программа 8.7
Адрес Код Метка Мнемокод Комментарий
0800 DB 20 CNT. IN20 получить число из входного устройства
0802 Е6 20 ANI 20 выполнить логическую операцию
0804 D3 30 OUT 30 записать результат в выходное устройство
0807 С3 0008 JMP CNT продолжать
Условные переходы организуются в программах с помощью команд условных переходов. При выполнении этих команд МП 8086 проверяет состояние соответствующего разряда регистра состояния. Если при проверке состояния разряда регистра состояния условие не подтверждается, то выполняется следующая по порядку команда программы. Все команды условных переходов — трехбайтные: первый байт содержит код команды, второй и третий байты — адрес передачи управления. Таким образом, команды условных переходов позволяют строить ветвящиеся алгоритмы и в зависимости от текущего значения результата выполнения программы переходить на различные участки программы.
Ниже приведена программа (программа 8.8) для определения 1 в пятом разряде числа, записанного во входном устройстве. Программа использует маскирование числа и условный переход.
Программа 8.8
Адрес Машинный Метка Мнемокод Комментарий код
0800 DB 20 WAIT IN 20 получить число из входного устройства
0802 Е6 20 ANI 20 проверить состояние пятого разряда числа
0804 СА 0008 JZ WAIT идти на WAIT, если в пятом разряде был 0
0807 CF RST 1 окончить выполнение программы
В представленных ранее программах имел место лишь один цикл, в котором работала микро-ЭВМ. Программа ожидания появления 1 во втором и пятом разрядах числа, записанного во входном устройстве (программа 8.9), содержит два цикла.
Программа 8.9
Адрес Машинный Метка Мнемокод Комментарий
код
0800 DB 20 WAIT1 IN 20 получить число из входного устройства
0802 Е6 04 AN I 00000100 выключен ли второй переключатель?
0804 СА 0008 JZ WAIT 1 если нет, продолжить WAIT 1
0807 3Е FF MVI A, FF если да, зажечь светодиоды
0809 D3 30 OUT 30 выходного регистра
080B DB 20 WAIT2 IN 20 получить число из входного устройства
080D Е6 20 ANI 00100000 выключен ли пятый переключатель?
080F СА 0В08 JZ WAIT 2 если нет, продолжать WAIT2
0812 3Е 00 MVI А, 00 если да, погасить светодиоды
0814 D3 30 OUT 30 выходного регистра
0816 С3 0008 JMP WAIT 1 повторить программу
; PrinterDemo.asm - Andrew Nelis 2003
;
; Simple demonstration of the printer.
;
; it is required to start "Printer.exe"
; before running this demonstration
; (select it from "Virtual Devices" menu
; of the emulator).
#make_COM#
; COM file is loaded at CS:0100h
ORG 100h
lea bx, message
mov cx, 27d ; Length of message
mov ax, 0h ; Ensure top and bottom of
; ax empty
spit:
mov al, [bx] ; Put char into al
out 130d, al ; push char out port
; (ie. into printer)
inc bx ; inc pointer
wait: ; Loop to ensure the printer
in al, 130d ; is ready, it clears
or al, 0 ; the port when this is true.
jnz wait
loop spit ; Go back and repeat if we're
; not finished
ret
message db "Hello World!", 10, 13, "------------", 07
Лекция 43
Дата добавления: 2016-07-05; просмотров: 2037;