Міністерство освіти і науки
Національний університет «Львівська політехніка»
Кафедра ЕОМ
Звіт
до лабораторної роботи № 5
з дисципліни: “ Засоби системного програмування”
на тему: “ Дослідження роботи команд переходів. Програмування задач з використанням алгоритмів розгалуження.”
Мета: Освоїти використання команд порівняння, умовного та безумовного переходів. Набути вміння використовувати арифметичні команди над знаковими даними та команди логічних операцій.
Короткі теоретичні відомості
Команди порівняння
CMP - Порівняння двох полів даних.
Команда виконує віднімання другого операнду від першого, але значення операндів не змінює. Операнди повинні бути однакової довжини: байт або слово.
Ця команда впливає на прапорці 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 – Логічне «І» - встановлюються прапорці, проте біти не змінюються.
Завдання:
Створити *.exe програму, яка реалізовує обчислення, заданого варіантом виразу.
Вхідні дані слід вважати цілими числами зі знаком, розміром один байт.
Результат обчислення виразу повинен записуватися у пам’ять.
Уникнути випадку некоректних обчислень при діленні на нуль та при переповненні розрядної сітки (вивести відповідне текстове повідомлення).
За допомогою Debug, відслідкувати правильність виконання програми (продемонструвати результати проміжних та кінцевих обчислень) та проаналізувати отримані результати для різних вхідних даних.
Скласти звіт про виконану роботу з приведенням тексту програми та коментарів до неї.
Дати відповідь на контрольні запитання.
ВАРІАНТ ЗАВДАННЯ(ВАРІАНТ 27):
27
Аналіз задачі:
Можливі два випадки ділення на нуль, які слід виявити і видати відповідне повідомлення, не переходячи до безпосередніх обчислень:
1) якщо і і ;
2) якщо і і .
Водночас, випадок коли є цілком допустимим.
Для уникнення можливого переповнення (при виконанні ділення), слід перейти до більшої розрядності операндів, тобто використати формат ділення 4 байт на 2 байти, при цьому сформувавши у відповідних регістрах коректні знакові числа, тобто розмножити старший біт вхідних даних.
Для результату достатньо передбачити два байти.
Текст програми та результати її роботи:
DOSSEG
.MODEL SMALL
.STACK 100h
.DATA
A db -27
B db -100
X dw 0
Hello db 13,10,' X=(3*a-6)/b if a<b',13,10,' X=45 if a=b',13,10,' X=-5*b/a if a>b',13,10,'$'
A_B db 13,10, ' a==b ====> X=45',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 hello
int 21h
mov al,A
cmp al,B
jne A_n_B
mov X,45
mov ah,09
mov dx,offset A_B
int 21h
jmp exit
A_n_b:
jg A_g_B
cmp A,0
je exit_A
mov ah,80h
and ah,al
sar ah,8
mov dl,ah
mov dh,dl
sub al, 6
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
jmp exit
A_g_B:
cmp B,0
je exit_B
mov al,B
mov ah,80h
and ah,al
sar ah,8
mov dl,ah
mov dh,dl
mov bl,-5
imul bl
mov bl,A
mov bh,80h
and bh,bl
sar bh,8
idiv bx
mov bl,B
mov bh,80h
and bh,bl
sar bh,8
add ax, 1
mov X,ax
jmp exit
exit_B: mov ah,09
mov dx,offset Error_B
int 21h
exit:
mov ah,4Ch
int 21h
end Start
/
Рис.1 Результат виконання програми
Дамп1 пам’яті містить такі дані:
Змінна A:
−127
10
=
81
16
ВПК: 81
Змінна B:
−127
10
=
81
16
ВПК: 81
X =4510 =
2