Міністерство освіти і науки України
Національний університет „Львівська політехніка”
Кафедра ЕОМ
Лабораторна робота №5
з курсу:
«Засоби системного прграмування»
на тему:«Дослідження роботи команд переходів. Програмування задач з використанням алгоритмів розгалуження»
Варіант: №7
Вираз:
Львів
2014
МЕТА РОБОТИ:
Освоїти використання команд порівняння, умовного та безумовного переходів. Набути вміння використовувати арифметичні команди над знаковими даними та команди логічних операцій.
ТЕОРЕТИЧНІ ВІДОМОСТІ:
Команди керування програмою.
Команда безумовного переходу JMP.
Дана команда додає значення вказане в операнді до значення в регістрі IP, який містить адресу команди, що розташована після JMP. Відповідно, якщо здійснюється перехід назад, то значення операнду буде від’ємне, якщо вперед – додатне.
Команди умовних переходів.
Працюють аналогічно до JMP та LOOP, за винятком того, що довжина переходу повинна бути в межах від -128 до +128 байт.
Переходи для беззнакових даних.
Мнемоніка
Опис
Прапорці, що перевіряються
JE/JZ
Перехід, якщо рівно/нуль
ZF
JNE/JNZ
Перехід, якщо не рівно/не нуль
ZF
JA/JNBE
Перехід, якщо вище/не нижче або рівно
ZF,CF
JAE/JNB
Перехід, якщо вище або рівно/ не нижче
CF
JB/JNAE
Перехід, якщо нижче/не вище або рівно
CF
JBE/JNA
Перехід, якщо нижче або рівно/не вище
CF,AF
Будь яку перевірку можна закодувати двома мнемо кодами. Наприклад JB та JNAE генерують однаковий об’єктний код, хоча позитивну перевірку JB легше зрозуміти аніж заперечну JNAE.
Переходи для знакових даних.
Мнемоніка
Опис
Прапорці, що перевіряються
JE/JZ
Перехід, якщо рівно/нуль
ZF
JNE/JNZ
Перехід, якщо не рівно/не нуль
ZF
JG/JNLE
Перехід, якщо більше/не менше або рівно
ZF,SF,OF
JGE/JNL
Перехід, якщо більше або рівно/ не менше
SF,OF
JL/JNE
Перехід, якщо менше/не більше або рівно
SF,OF
JLE/JNG
Перехід, якщо менше або рівно/не більше
ZF,SF,OF
Команди переходу для умови рівно або нуль (JE/JZ) та не рівно або не нуль (JNE/JNZ) існують як для знакових так і для без знакових даних. Стан рівно/нуль наступає незалежно від знаку.
Спеціальні арифметичні перевірки.
Мнемоніка
Опис
Прапорці, що перевіряються
JS
Перехід, якщо є знак(від’ємне)
SF
JNS
Перехід, якщо немає знаку(додатнє)
SF
JC
Перехід, якщо є перенос (аналогічно JB)
CF
JNC
Перехід, якщо немає переносу
CF
JO
Перехід, якщо є переповнення
OF
JNO
Перехід, якщо немає переповнення
OF
JP/JPE
Перехід, якщо паритет парний
PF
JNP/JP
Перехід, якщо паритет непарний
PF
JCXZ - ще одна команда умовного переходу перевіряє чи рівний вміст регістра CX нулю. Ця команда повинна знаходитися безпосередньо після арифметичної команди чи команди порівняння. Одним з можливих місць застосування команди JCXZ може бути початок циклу, де вона перевіряє чи не містить регістр CX нульового значення.
Оператор циклу LOOP.
Передає керування на мітку, вказану як операнд, поки значення в регістрі CX не стане рівне нулю.
mov cx, 5
Lab:
mov ax, bx
inc ax
loop Lab
тобто оператори (mov ax, bx) та (inc ax) повторяться 5 разів.
Існують додатково також різновиди цієї команди:
LOOPE(або LOOPZ) – передає керування за адресою, вказаною в операнді якщо CX містить нульове значення і встановлений прапорець нуля, тобто ZF=1.
LOOPNE(або LOOPNZ) передає керування за адресою, вказаною в операнді якщо CX містить нульове значення і прапорець нуля скинуто, тобто ZF=0.
Команди порівняння
CMP - Порівняння двох полів даних.
Команда виконує віднімання другого операнду від першого, але значення операндів не змінює. Операнди повинні бути однакової довжини: байт або слово. Команда може мати наступний формат:
CMP регістр-регістр;
CMP пам'ять-регістр;
CMP безпосереднє значення -регістр;
CMP регістр-пам’ять;
CMP безпосереднє значення –пам’ять
Ця команда впливає на прапорці AF,CF,OF, PF,SF,ZF
CMPS, CMPSB, CMPSW Порівняння рядків довільної довжини. CMPSB – порівнює по байту, CMPSW – порівнює по словах. Перший операнд цих команд адресується регістровою парою DS:SI, а другий – ES:DI. Якщо прапорець DF=0, то порівняння відбувається зліва направо і регістри SI та DI збільшуються після кожного порівняння, інакше – навпаки і регістри SI та DI зменшуються. Як правило, використовуються з префіксами повтору. Впливають на прапорці AF,CF,OF,PF,SF,ZF.
Логічні команди
Логічні команди відіграють важливу роль в організації програм і використовуються для скиду і встановлення біт та для арифметичних операцій. Всі вони обробляють один байти або одне слово в регістрі чи в пам’яті і встановлюють прапорці CF, OF, PF, SF, ZF
Перший операнд в логічних командах вказує на один байт чи слово в регістрі чи пам’яті і є єдиним значенням, яке може змінюватися після виконання команд..
AND Логічне «І».Порозрядна кон’юнкція бітів операндів. Якщо відповідні біти операндів рівні 1, то у першому(лівому) операнді встановлюється біт=1, в інших випадках результат =0.
OR логічне «АБО». Порозрядна диз’юнкція бітів операндів. Якщо хоча б один з порівнюваних бітів рівний 1, то результат рівний 1, якщо порівнювані біти рівні 0, то результат - 0 .
XOR логічне «виключне АБО». Якщо один з порівнюваних бітів рівний 0, а інший 1, то результат рівний 1, якщо порівнювані біти однакові, то результат -0.
NOT логічне «НЕ». Порозрядна інверсія бітів операнду. Встановлює протилежне значення бітів у байті чи слові в регісті чи в пам’яті. Прапорці при цьому не змінюються.
TEST – Логічне «І» - встановлюються прапорці, проте біти не змінюються.
Приклади використання.
Нехай AL=1100 0101b; BH=0101 1100b.
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.
Приклад використання команди TEST.
1. TEST BL,11110000B ; будь який з лівих бітів в BL
JNZ ... ; рівний одиниці ?
2. TEST AL,00000001B ; регістр AL містить
JNZ ... ; непарне значення?
3. TEST DX,OFFH ; регістр DX містить
JZ ... ; нульове значення?
ЗАВДАННЯ:
Створити *.exe програму, яка реалізовує обчислення, заданого варіантом виразу.
Вхідні дані слід вважати цілими числами зі знаком, розміром один байт.
Результат обчислення виразу повинен записуватися у пам’ять.
Уникнути випадку некоректних обчислень при діленні на нуль та при переповненні розрядної сітки (вивести відповідне текстове повідомлення).
За допомогою Debug, відслідкувати правильність виконання програми (продемонструвати результати проміжних та кінцевих обчислень) та проаналізувати отримані результати для різних вхідних даних.
Скласти звіт про виконану роботу з приведенням тексту програми та коментарів до неї.
Дати відповідь на контрольні запитання.
КОД ПРОГРАМИ:
DOSSEG
.8086
.MODEL SMALL
.STACK 100h
.DATA
A db -127
B db -127
X dw 0
Hello db 13,10,' X=(4*b-1)/a if a>b',13,10,' X=255 if a==b',13,10,' X=(a-5)/b if a<b',13,10,'$'
A_rivne_B db 13,10, ' a==b ====> X=255',13,10,'$' ;255d=0FFh
Error_A db 13,10,' a<b and a==0 ----> divide by zero',13,10,'$'
Error_B db 13,10,' a>b and b==0 ----> divide by zero',13,10,'$'
.CODE
Start:
Start:
mov ax,@data
mov ds,ax
mov ah,09
mov dx,offset hello
int 21h
mov al,A
cmp al,B
jne A_ne_rivne_B
mov X,255
mov ah,09
mov dx,offset A_rivne_B
int 21h
jmp exit
A_ne_rivne_B: jg A_smoller_B
cmp B,0
je exit_B
mov ah,80h
and ah,al
sar ah,8
mov dl,ah
mov dh,dl
mov bl,B
mov bh,80h
and bh,bl
sar bh,8
mov cl,2
shl bx, cl
clc ;
sub bx,1
idiv dx:ax
mov X,bx
jmp exit
exit_B: mov ah,09
mov dx,offset Error_B
int 21h
jmp exit
A_smoller_B: cmp A,0
je exit_A
mov al,A
mov ah,80h
and ah,al
sar ah,8
sub ax,5 ;ax=A-5
mov dx,8000h
and dx,ax
sar dx,15
mov bl,B
mov bh,80h
and bh,bl
sar bh,8
idiv bx
mov X,ax
jmp exit
exit_A: mov ah,09
mov dx,offset Error_A
int 21h
exit:
mov ah,4Ch
int 21h
end Start
end
СКРІНШОТ ВИКОНАННЯ ПРОГРАМИ:
/
Рис. 1. Результатом виконання приведеної програми: вивід
ВИСНОВОК:
Під час виконання даної лабораторної роботи я освоїв використання команд порівняння, умовного та безумовного переходів та набув вміння використовувати арифметичні команди над знаковими даними та команди логічних операцій.