|
|
Окончание табл. 1 |
|
JGE |
SF = OF |
Больше или равно |
|
JNL |
Не меньше |
||
|
|||
JL |
|
Меньше |
|
SF< >OF |
Не больше и не |
||
JNGE |
|||
|
равно |
||
|
|
||
JLE |
ZF =1 или |
Меньше или равно |
|
JNG |
(SF xor OF) = 1 |
Не больше |
|
JNE |
ZF = 0 |
Не равно |
|
JNZ |
Не ноль |
||
|
|||
JNO |
OF = 0 |
Нет переполнения |
|
JO |
OF = 1 |
Есть переполнение |
|
JNP |
PF = 0 |
Нет четности |
|
JPO |
Нечетное |
||
|
|||
JP |
PF = 1 |
Есть четность |
|
JPE |
Четное |
||
|
|||
JNS |
SF = 0 |
Нет знака |
|
JS |
SF = 1 |
Есть знак |
Слова «выше и ниже» в таблице относят к сравнению чисел без знака; слова «больше» и «меньше» учитывают знак.
При программировании в командах перехода обычно не используют явные значение смещения D8, а применяют метки. Метка - это идентификатор, присваиваемый первому байту команды, у которой она появляется. Наличие метки в команде не обязательно, но если она есть, то она становится символическим именем адреса данной команды.
Команды условного перехода используются для программирования выполнения различных действий в зависимости от заданного условия (условные операторы языков высокого уровня, например, оператору i f . . then .. else фактически реализуются на командах условного перехода) [3].
Пример кода, реализующего два варианта действий в зависимости от условия, приведено ниже:
4
CMP |
AL,100 |
;устанавливаем флаги |
JA |
NEXT |
;если AL>100, то переходим на адрес, указанный |
|
|
меткой next |
MOV |
AH,2 |
; иначе умножаем содержимое регистра AL на 2 |
MUL |
AH |
|
JMP |
exit |
;переход на метку exit |
next: ADD |
AL,5 |
;прибавляем к содержимому AL число 5 |
exit: |
|
|
------------------- |
;другие команды |
|
Данный код выполняет следующие действия: если значение регистра AL>100, то к нему прибавляется 5, иначе его значение умножается на 2 . Результат сохраняется в регистре AL. В коде используются две метки: next и exit.
Для сравнения чисел используется команда CMP, которая осуществляет операцию вычитания. Результат никуда не записывается, но при этом устанавливаются флаги регистра состояния.
Задачи:
1.Изучить назначение регистра флагов микропроцес-
сора (МП) 8086;
2.Используя эмулятор Emu8086, разработать программный код, позволяющий изменить определенные флаги регистра состояния (в соответствии с вариантом);
3.Сравнить команды сложения чисел ADD и ADC.
4.Разработать программный код для МП 8086, осуществляющий сложение содержимого регистров R1 и R2 при выполнении заданного условия COND, иначе - их вычитание;
5.Составить отчет по пунктам 2-4;
6.Ответить на контрольные вопросы для самопроверки.
5
Порядок выполнения работы :
1.Изучить теоретическую часть данной работы и получить представление о назначении регистра состояния и его флагах;
2.В эмуляторе Emu8086 создать новый проект, выбрав команду «New» на панели инструментов и шаблон «Bin template»;
3.В открывшемся окне после строки «add your code here» добавьте код на языке ассемблера, который будет устанавливать в «1» флаги, указанные в табл. 2;
|
|
|
|
|
|
Таблица 2 |
|
|
|
Варианты заданий |
|
||
|
|
|
|
|
|
|
Номер |
Флаги |
R1 |
|
R2 |
R3 |
COND |
варианта |
|
|
|
|
|
|
1 |
CF,ZF |
AX |
|
BX |
CX |
R3=1 |
2 |
AF,OF |
AL |
|
AH |
CH |
R3>13 |
3 |
SF,PF |
CL |
|
DL |
AL |
R3<230 |
4 |
CF,OF |
BL |
|
AL |
DH |
R3≥123 |
5 |
ZF,SF |
DH |
|
BH |
AL |
R3<>112 |
6 |
AF,PF |
DH |
|
DL |
CH |
R3≤21 |
7 |
OF,PF |
AH |
|
CH |
DL |
R3>15 |
8 |
AF,ZF |
AH |
|
BH |
BL |
R3<35 |
9 |
SF,CF |
AH |
|
DH |
DL |
R3=55 |
10 |
SF,AF |
AH |
|
BL |
DH |
R3≤124 |
11 |
SF,ZF |
CH |
|
BH |
DX |
R3≥300 |
12 |
SF,PF |
CL |
|
BL |
AX |
R3<>450 |
13 |
AF,CF |
CH |
|
CL |
BX |
R3=500 |
14 |
AF,ZF |
AH |
|
BL |
DH |
R3>22 |
15 |
AF,SF |
BH |
|
CL |
AL |
R3<11 |
16 |
OF,CF |
BL |
|
DL |
CX |
R3<>600 |
17 |
OF,PF |
DX |
|
BX |
AL |
R3≤144 |
18 |
OF,ZF |
AX |
|
BX |
DH |
R3≥33 |
19 |
CF,ZF |
BX |
|
CX |
AH |
R3>43 |
20 |
CF,OF |
CX |
|
DX |
AL |
R3<22 |
6
4.Выполнить переход в режим эмуляции работы процессора, выбрав команду «Emulate» на панели инструментов. Отобразите на экране содержимое флагов регистра состояния, нажав на кнопку «flags» в окне «emulator:»;
5.Осуществить пошаговое выполнение разработанного кода, нажимая на кнопку «single step». Убедитесь, что в результате выполнения программы, заданные флаги устанавливаются в «1»;
6.Создайте проект, как в пункте 2, и наберите нижеследующий код:
mov |
AL, 2Dh |
add |
AL, 0D3h |
add |
AL,5 |
Выполните программу в пошаговом режиме и запишите конечное значение регистра AL.
7. Создайте проект, как в пункте 2, и наберите нижеследующий код:
mov |
AL, 2Dh |
add |
AL, 0D3h |
adc |
AL,5 |
Выполните программу в пошаговом режиме и запишите конечное значение регистра AL. Сравните полученные значения регистра AL в пунктах 6 и 7 и сделайте вывод.
8.Создайте новый проект, как в пункте 2, и разработайте код, осуществляющий сложение содержимого регистров R1 и R2 при выполнении условия COND, иначе - вычитание. Обозначение регистров R1 и R2 и вид условия COND представлены в таблице 2. Осуществите проверку работы программы в пошаговом режиме;
9.Оформите отчет по работе. Отчет должен содер-
жать:
-цель работы;
-задание;
-листинги разработанных программных кодов;
-вывод по работе.
7
Контрольные вопросы :
1.Назначение регистра флагов?
2.Какой флаг устанавливается в единицу, если результат последней операции равен нулю?
3.Какой флаг используется при двоично-десятичной арифметике?
4.В каком случае устанавливается флаг OF?
5.Какой флаг используется для проверки правильности полученных данных по линиям связи?
6.После выполнения каких операций изменяются флаги регистра состояния?
7.В зависимости от чего осуществляется загрузка нового адреса в регистр IP в командах условного перехода?
8.Что представляет собой метка?
9.Чем отличается команда ADD от ADC?
10.Какое арифметическое действие выполняет команда
CMP?
8