Главная Случайная страница


Полезное:

Как сделать разговор полезным и приятным Как сделать объемную звезду своими руками Как сделать то, что делать не хочется? Как сделать погремушку Как сделать так чтобы женщины сами знакомились с вами Как сделать идею коммерческой Как сделать хорошую растяжку ног? Как сделать наш разум здоровым? Как сделать, чтобы люди обманывали меньше Вопрос 4. Как сделать так, чтобы вас уважали и ценили? Как сделать лучше себе и другим людям Как сделать свидание интересным?


Категории:

АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника






Команды переходов для чисел без знака





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

Date: 2016-07-18; view: 255; Нарушение авторских прав; Помощь в написании работы --> СЮДА...



mydocx.ru - 2015-2024 year. (0.006 sec.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав - Пожаловаться на публикацию