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