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