МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”
Кафедра ЕОМ
/
Звіт
до лабораторної роботи № 4
з дисципліни: “ Засоби системного програмування”
на тему: “ Програмування задач лінійної структури.
Обчислення виразів.”
Мета: вивчити способи задання констант та змінних в Асемблері та набути навиків використання арифметичних команд над даними різного розміру.
Теоритичні відомості:
Арифметичні операції в Асемблері
Для виконання даної роботи слід розглянути наступні команди арифметики: ADD ADC INC SUB SBB DEC CMP NEG MUL DIV
Команди ADD і SUB виконують додавання й віднімання байтів або слів, що містять двійкові дані. Віднімання виконується у комп’ютері по методу додавання із двійковим доповненням: для другого операнда встановлюються зворотні значення бітів і додається 1, а потім відбувається додавання з першим операндом. У всьому, крім першого кроку, операції додавання й віднімання ідентичні. Можливі п’ять ситуацій:
ADD / SUB регістр-регістр;
ADD / SUB пам'ять-регістр;
ADD / SUB регістр-пам'ять;
ADD / SUB регістр-безпосереднє значення;
ADD / SUB пам’ять-безпосереднє значення.
Команда ADC виконує додавання з врахуванням переносу. Тобто якщо прапорець CF має значення 1, то ця команда додає 1 до першого операнду, а вже потім додає другий операнд.
Команда SBB виконує віднімання з запозиченням. Тобто якщо прапорець CF має значення 1, то ця команда спочатку віднімає 1 від першого операнду, а вже потім віднімає від нього другий операнд.
Завдання:
Створити *.exe програму, яка реалізовує обчислення, заданого варіантом виразу і зберігає результат в пам’яті.Вхідні операнди А, В, С, D, E, F вважати беззнаковими і довжиною в байтах, згідно з індексу; К – константа, довжина якої визначається значенням(згідно варіанту). Для її опису слід використати директиву EQU.
За допомогою Debug, відслідкувати правильність виконання програми (продемонструвати результати проміжних та кінцевих обчислень).
23
X=A2*B2-C1+D4/E2+K
7AA02023
Текст програми:
DOSSEG
.MODEL SMALL
.STACK 100h
.DATA
K_Ml EQU 2023h
K_St EQU 7AA0h
A dw 7012h
B dw 1412h
C db 12h
D dd 38A221B8h
E dw 7878h
Temp1 dw 00h,00h
Temp2 dw 00h,00h
Temp3 dw 00h,00h
X dw 00h,00h,00h
.CODE
start:
mov ax,@data
mov ds,ax
mov ax,A
mul B
mov [Temp1+0], ax
mov [Temp1+2], dx
mov ax,word ptr[Temp1]
mov bh,00
mov bl,C
sub ax,bx
sbb word ptr[Temp1+2],0
mov word ptr[Temp3+0],ax
mov word ptr[Temp3+2],dx
mov ax,word ptr[D]
mov dx,word ptr[D+2]
div E
mov dx,K_St
add ax, K_Ml
mov [Temp2+0],ax
adc dx,0
mov [Temp2+2],dx
mov ax,word ptr[Temp3+0]
mov dx,word ptr[Temp2+0]
add ax,dx
mov [X],ax
adc [X+2],0
mov ax,word ptr[Temp3+2]
mov dx,word ptr[Temp2+2]
add ax,dx
mov [X+2],ax
adc [X+4],0
mov ah,4Ch
int 21h
end start
end
Обчислення:
Temp1= A2*B2-C1= 701216*141216-1216=08C9493216;
Temp2= D4/E2= 38A221B816/787816=785916;
Temp3= Temp2+K = 785916+7AA0202316=07AA0987C16;
X= Temp1+ Temp3=08C9493216+07AA0987C16=8369E1AE16
Проміжні результати:
/
Рис.1. Змінна temp1, в регістрі dx – старші байти, в аx – молодші
/
Рис.2. Змінна temp2, старші байти в регістрі dx, а молодші байти в ax
/
Рис.3. Змінна temp3, старші байти в регістрі dx, а молодші в ax
/
Рис.4. Змінна Х, результат виразу, старші байти в регістрі ax, a молодші dx
Висновок: в даній лабораторній роботі я отримав навики використання різних арифметичних команд над даними різного розміру і використав отримані знання для обчислення індивідуального завдання на мові Assembler.