Міністерство освіти та науки України
Національний університет «Львівська політехніка»
ЗВІТ
З лабораторної роботи №5
З дисципліни: «Засоби системного програмування»
На тему: «Дослідження роботи команд переходів. Програмування задач з використанням алгоритмів розгалуження.»
Львів 2014
ЗАВДАННЯ:
Написати програму, яка обчислює арифметичний вираз і результат записує в пам’ять. Вхідні дані слід вважати цілими числами зі знаком, розміром один байт. Результат обчислення виразу повинен записуватися у пам’ять. Уникнути випадку некоректних обчислень при діленні на нуль та при переповненні розрядної сітки.
ВАРІАНТИ ЗАВДАННЯ:
А, В - знакові операнди, розміром один байт.
Заданий вираз:
18
Аналіз задачі:
Можливі два випадки ділення на нуль, які слід виявити і видати відповідне повідомлення, не переходячи до безпосередніх обчислень:
1) якщо і і ;
2) якщо і і .
Водночас, випадок коли є цілком допустимим.
Лістинг програми(1)
DOSSEG
.MODEL SMALL
.STACK 100h
.DATA
A db -127
B db -127
X dw 0
Message db 13,10,'if a<b it X=5*a/b-4',13,10,'if a==b it X=-55',13,10,'if a>b it X=(b-5)/a',13,10,'$'
A_B db 13,10, ' a==b ----> X=-55',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 Message
int 21h
mov al,A
cmp al,B
jne A_n_B
mov X,-55
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 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
idiv bx
imul 5
sub ax,4
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
mov ah,80h
and ah,al
sar ah,8
sub ax,5
mov dx,8000h
and dx,ax
sar dx,15
mov bl,A
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):
-127=FF8116(2байти)=8116(1байт)( 81 (запис в пам’яті)
-55=FFC916(2байти)( C9FF (запис в пам’яті)
Лістинг програми(2)
DOSSEG
.MODEL SMALL
.STACK 100h
.DATA
A db -72
B db 12
X dw 0
...
END
Результат роботи програми(2):
-72=FFB816(2байти)=B816(1байт) ( B8 (запис в пам’яті)
12=0C16(1байт) ( 0C (запис в пам’яті)
-72/12*5-4=-34=FFDE16(2байти)( DEFF (запис в пам’яті)
Лістинг програми(3)
DOSSEG
.MODEL SMALL
.STACK 100h
.DATA
A db 30
B db -25
X dw 0
...
END
Результат роботи програми(3):
30=1E16 (1байт) ( 1E (запис в пам’яті)
-25=FFE716(2байти)=E716(1байт) ( E7 (запис в пам’яті)
(-25-5)/30=-1=FFFF16(2байти)( FFFF (запис в пам’яті)
Висновок: я освоїв використання команд порівняння, умовного та безумовного переходів. Набув вміння використовувати арифметичні команди над знаковими даними та команди логічних операцій.