Автор: Пользователь скрыл имя, 28 Мая 2013 в 14:23, лабораторная работа
Мета роботи: Освоїти використання команд порівняння, умовного та безумовного переходів. Набути вміння використовувати арифметичні команди над знаковими даними та команди логічних операцій.
Дана команда додає значення вказане в операнді до значення в регістрі IP, який містить адресу команди, що розташована після JMP. Відповідно, якщо здійснюється перехід назад, то значення операнду буде від’ємне, якщо вперед – додатне.
Міністерство освіти і науки України
Національний університет “Львівська політехніка”
Кафедра «Електронні обчислювальні машини»
Лабораторна робота №5
“Дослідження роботи команд переходів. Програмування задач з використанням алгоритмів розгалуження.”
з дисципліни:
“ Засоби системного програмування”
Виконав:
студент групи КІ-25
Газдаг Р.О.
Прийняв:
Грица Р.В
Львів - 2013
Мета роботи:
Освоїти використання команд
порівняння, умовного та безумовного
переходів. Набути вміння використовувати
арифметичні команди над
Теоретичні відомості:
Команди керування програмою.
Команда безумовного переходу 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 разів.
Існують додатково також різновиди цієї команди:
Команди порівняння
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 ... ; нульове значення?
Завдання:
Вхідні дані слід вважати цілими числами зі знаком, розміром один байт.
Результат обчислення виразу повинен записуватися у пам’ять.
Уникнути випадку некоректних обчислень при діленні на нуль та при переповненні розрядної сітки (вивести відповідне текстове повідомлення).
А, В - знакові операнди, розміром один байт.
4 |
Код програми:
DOSSEG
.MODEL SMALL
.STACK 100h
.DATA
A db -25
B db 5
X dw 0
Task db 13,10,' X=3*a/b+10 if a<b',13,10,' X=-51 if a==b',13,10,' X=(b-4)/a if a>b',13,10,'$'
A_B db 13,10, ' a==b ====> X=-51',13,10,'$'
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:
mov ax,@data
mov ds,ax
mov ah,09
mov dx,offset Task
int 21h
mov al,A
cmp al,B
jne A_n_B
mov X,-51
mov ah,09
mov dx,offset A_B
int 21h
jmp exit
A_n_b: jg A_g_B
cmp B,0
je exit_B
mov al,3
imul A
idiv B
add al,10
cbw
mov X,ax
jmp exit
exit_B: mov ah,09
mov dx,offset Error_B
int 21h
jmp exit
A_g_B: cmp A,0
je exit_A
mov al,B
sub al,4
cbw
idiv A
cbw
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
Результати виконання програми:
А = 0 B = -20
A = -5 B = 0
A = B = -20
A = -25 B = 5
A = 20 B = -36
Висновок:
У цій лабораторній роботі я освоїв використання команд порівняння, умовного та безумовного переходів. Набув вміння використовувати арифметичні команди над знаковими даними та команди логічних операцій.