Міністерство освіти і науки України
Національний університет “Львівська політехніка”
Кафедра ЕОМ
Лабораторна робота №4
з дисципліни:
“Засоби системного програмування”
на тему:
“Програмування задач лінійної структури.
Обчислення виразів”
Варіант: №7
X=A4/B2-C1*(D1+E2-K)::717
Мета роботи:
Вивчити способи задання констант та змінних в Асемблері та набути навиків використання
арифметичних команд над даними різного розміру
Теоретичні відомості:
Для виконання даної роботи слід розглянути наступні команди арифметики: ADD ADC INC SUB SBB DEC CMP NEG MUL DIV
Команди ADD і SUB виконують додавання й віднімання байтів або слів, що містять двійкові дані. Віднімання виконується у комп’ютері по методу додавання із двійковим доповненням: для другого операнда встановлюються зворотні значення бітів і додається 1, а потім відбувається додавання з першим операндом.
Переповнення.При виконанні арифметичних операцій можливе переповнення. Один байт містить знаковий біт і сім біт даних, тобто значення від -128 до +127. Результат арифметичної операції може легко перевищити розрядність однобайтового регістра. Наприклад, результат додавання в регістрі AL, що перевищує його розрядність, автоматично не переходить у регістр AH. Припустимо, що регістр AL містить 60h, тоді результат команди ADD AL,20h генерує в AL суму -.80h. Але операція також встановлює прапорець переповнення і прапорець знаку у стан "негативно". Причина в тому, що.80h або двійкове 1000 0000 є від’ємним числом. Т.ч. в результаті, замість +128, ми одержимо -128. Оскільки регістр AL занадто малий для такої операції то варто скористатися регістром AX. Для розширення AL до AX можна скористатися командою CBW (Convert Byte to Word - перетворити байт у слово).
CBW
ADD AX,20H
Але повне слово має також обмеження.
Для беззнакових величин всі біти є бітами даних і замість обмеження +32767 регістр може містити числа до +65535. Для знакових величин лівий біт є знаковим. Команди ADD і SUB не роблять різниці між знаковими і беззнаковими величинами, вони просто додають і віднімають біти.
Наприклад при додаванні двох двійкових чисел, одне з яких містить одиничний лівий біт можливе такі випадки. Для беззнакового числа біти представляють додатне число 249, для знакового – від’ємна число -7:
Двійкове представлення результату додавання однакове для беззнакового й знакового числа. Однак, біти представляють +251 для беззнакового числа й -5 для знакового. Таким чином, числовий вміст поля може інтерпретуватися по різному. Стан "перенос" виникає в тому випадку, коли є пеpенос у знаковий розряд. Стан "переповнення" виникає у тому випадку, коли перенос у знаковий розряд не створює переносу з розрядної сітки або перенос із розрядної сітки відбувається без переносу в знаковий розряд. При виникненні переносу при додаванні беззнакових чисел, результат одержується неправильний:
Таким чином, перенос, що може виникати при додаванні найстарших слів, слід трактувати для беззнакових даних як значущий біт і враховувати його в загальній сумі, а для знакових, вважати ознакою від’ємного числа.
Команда ADC виконує додавання з врахуванням переносу. Тобто якщо прапорець CF має значення 1, то ця команда додає 1 до першого операнду, а вже потім додає другий операнд.
Команда SBB виконує віднімання з запозиченням. Тобто якщо прапорець CF має значення 1, то ця команда спочатку віднімає 1 від першого операнду, а вже потім віднімає від нього другий операнд.
Команда INC/DEC додає / віднімає одиницю до байту або слова в регістрі або пам’яті.
Команда CMP виконує операцію порівняння двох полів даних. Фактично, ця команда виконує віднімання другого операнду від першого, але значення операндів на змінює. Операнди повинні бути однакової дожини: байт або слово. Команда може мати наступний формат.
Завдання:
Створити *.exe програму, яка реалізовує обчислення, заданого варіантом виразу і зберігає результат в пам’яті.Вхідні операнди А, В, С, D, E, F вважати беззнаковими і довжиною в байтах, згідно з індексу; К – константа, довжина якої визначається значенням(згідно варіанту). Для її опису слід використати директиву EQU.
За допомогою Debug, відслідкувати правильність виконання програми (продемонструвати результати проміжних та кінцевих обчислень).
Скласти звіт про виконану роботу з приведенням тексту програми та коментарів до неї.
Дати відповідь на контрольні запитання.
Код програми:
DOSSEG
.8086
.MODEL SMALL
.STACK 100h
.DATA
Surname db 'Karapinka',13,10,'$'
Mij_Variant db '7<<<X=A4/B2-C1*(D1+E2-K)>>>717',13,10,'$'
;========================================================
A4 dd 0Ah ;10d=0Ah
B2 dw 0Ah
C1 db 0
D1 db 17h ;17h =23d
E2 dw 700h ;700h=1792d
K equ 717h ;717h=1815d
chastka_AB dw 0
suma_DE dw
riznitza_SumiDE&K dd 0
Dobutok_C&Duzok dq 0
riznitza_Kinzeve dq 0
;================================
.CODE
Start:
mov ax,@data
mov ds,ax
;====================
clc
mov ax,word ptr A4
mov dx,word ptr [A4+2]
div B2
mov chastka_AB,ax
;================
clc
mov ax,word ptr D1
mov dx,E2
add ax,dx
mov suma_DE,ax
;=============
clc
mov ax,word ptr suma_DE
mov dx,K
sub ax,dx
mov word ptr riznitza_SumiDE&K,ax
;====================================
clc
mov ax,word ptr riznitza_SumiDE&K
mul C1
mov word ptr Dobutok_C&Duzok,ax
mov word ptr [Dobutok_C&Duzok+2],dx
mov ax,word ptr [riznitza_SumiDE&K+2]
mul C1
add ax,word ptr [riznitza_SumiDE&K+2]
mov word ptr [riznitza_SumiDE&K+2],ax
adc dx,0
mov word ptr [riznitza_SumiDE&K+4],dx
;====================================
clc
mov ax,chastka_AB
mov dx,word ptr Dobutok_C&Duzok
sub ax,dx
mov word ptr riznitza_Kinzeve,ax
;================================
mov ah,4Ch
int 21h
end Start
END
Результати виконання програми:
/
Рис.1. Проміжний результат chastka_AB.
/
Рис.2. Проміжний результат suma_DE.
/
Рис.3. Проміжний результат riznitza_SumiDE&K.
/
/
/
Рис.4. Проміжний результат Dobutok_C&Duzok.
/
Рис.5. Проміжний результат riznitza_Kinzeve.
Висновок:
Під час виконання даної лабораторної роботи я Вивчив способи задання констант та змінних в Асемблері та набув навиків використання арифметичних команд над даними різного розміру
.