Міністерство освіти та науки України
Національний університет «Львівська політехніка»
ЗВІТ
З лабораторної роботи №4
З дисципліни: «Засоби системного програмування»
На тему: «Програмування задач лінійної структури. Обчислення виразів.»
Мета: вивчити способи задання констант та змінних в Асемблері та набути навиків використання арифметичних команд над даними різного розміру.
ЗАВДАННЯ:
Створити *.exe програму, яка реалізовує обчислення, заданого варіантом виразу і зберігає результат в пам’яті.Вхідні операнди А, В, С, D, E, F вважати беззнаковими і довжиною в байтах, згідно з індексу; К – константа, довжина якої визначається значенням(згідно варіанту). Для її опису слід використати директиву EQU.
За допомогою Debug, відслідкувати правильність виконання програми (продемонструвати результати проміжних та кінцевих обчислень).
Скласти звіт про виконану роботу з приведенням тексту програми та коментарів до неї.
Дати відповідь на контрольні запитання.
ВАРІАНТ ЗАВДАННЯ:
№
Вираз
K
2
X=A4/B2+C3-D1*E1-K
202
Лістинг програми:
DOSSEG
.MODEL SMALL
.STACK 100h
.DATA
K EQU 202h
A dd 10000 ; оголошуємо потрібні нам змінні
B dw 10
C dw 01,00
D db 10
E db 12
Temp1 dw 00h,00h ; змінні для проміжних результатів
Temp2 dw 00h,00h
X dw 00h,00h ; змінна для кінцевого результату
;X=A4/B2+C3-D1*E1-K
.CODE
go:
mov ax,@data
mov ds,ax
;Temp1 <- A4/B2 ; в цьому блоці виконуємо операцію ділення
mov ax,word ptr A+2 ; переміщуємо старшу частину змінної А в регістр ах
mov bx,1 ; переміщуємо 1 в регістр bx
mul bx ; робимо множення на 1
div B ; виконуємо ділення
mov Temp1+2,ax ; записуємо частку старшої частини в Temp1 зі зміщенням на 2 байти
mov ax,word ptr A ; переміщуємо молодшу частину змінної А у регістр ах
div B ; виконуємо ділення
mov Temp1,ax ; записуємо частку в Temp1
;Temp2 <- D1*E1 ; в цьому блоці виконуємо операцію множення
mov ax,0 ; онулюємо регістр ах
mov ax,word ptr D ; переносимо значення змінної D в регістр ax
mul E ; виконуємо множення
mov Temp2,ax ; молодший результат множення записуємо в Temp2
mov Temp2+2,dx ; старший результат множення записуємо в Temp2 зі зміщення у 2 байти
;Temp1 + C3 - Temp2 – K ; в цьому блоці виконуємо операцію додавання та віднімання з використанням
; проміжних результатів та змінних
mov ax,0 ; онулюємо регістр ах
mov ax, word ptr C ; переносимо значення зміноої С в регістр ах
add ax,Temp1 ; виконуємо додавання
adc dx,Temp1+2 ; виконуємо додавання з врахуванням переносу
sub ax,Temp2 ; виконуємо віднімання
sbb dx,0 ; виконуємо віднімання з запозиченням
add ax,K ; виконуємо додавання
mov X,ax ; переміщаємо молодшу частину результату з регістру ах у змінну Х
mov X+2,dx ; переміщаємо старшу частину результату з регістру dх у змінну Х зі зміщенням на 2 байти
int 21h ; переривання
end go
Висновок: я навчився виконувати операції над цілими без знаковими даними.
Використовувати стандартні функції для виконання цих операцій.