МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”
/
Кафедра ЕОМ
Лабораторна робота №4
з курсу
”Системне програмування ”
Програмування задач лінійної структури. Обчислення виразів.
МЕТА: вивчити способи задання констант та змінних в Асемблері та набути навиків використання арифметичних команд над даними різного розміру .
Арифметичні операції в Асемблері
Для виконання даної роботи слід розглянути наступні команди арифметики: ADD ADC INC SUB SBB DEC CMP NEG MUL DIV
Команди ADD і SUB виконують додавання й віднімання байтів або слів, що містять двійкові дані. Віднімання виконується у комп’ютері по методу додавання із двійковим доповненням: для другого операнда встановлюються зворотні значення бітів і додається 1, а потім відбувається додавання з першим операндом. У всьому, крім першого кроку, операції додавання й віднімання ідентичні. Можливі п’ять ситуацій:
ADD / SUB регістр-регістр;
ADD / SUB пам'ять-регістр;
ADD / SUB регістр-пам'ять;
ADD / SUB регістр-безпосереднє значення;
ADD / SUB пам’ять-безпосереднє значення.
Переповнення.При виконанні арифметичних операцій можливе переповнення. Один байт містить знаковий біт і сім біт даних, тобто значення від -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:
Беззнакове
Знакове
11111001
249
-7
00000010
2
+2
11111011
251
-5
Двійкове представлення результату додавання однакове для беззнакового й знакового числа. Однак, біти представляють +251 для беззнакового числа й -5 для знакового. Таким чином, числовий вміст поля може інтерпретуватися по різному. Стан "перенос" виникає в тому випадку, коли є пеpенос у знаковий розряд. Стан "переповнення" виникає у тому випадку, коли перенос у знаковий розряд не створює переносу з розрядної сітки або перенос із розрядної сітки відбувається без переносу в знаковий розряд. При виникненні переносу при додаванні беззнакових чисел, результат одержується неправильний:
Беззнакове
Знакове
CF
OF
11111100
252
-4
00000101
5
+5
00000001
1
1
1
0
(неправильно)
При виникненні переповнення при додаванні знакових чисел, результат виходить неправильний:
Беззнакове
Знакове
CF
OF
01111001
121
+121
00001011
11
+11
10000100
132
-124
0
1
(неправильно)
При операціях додавання й віднімання може одночасно виникнути й переповнення, і перенос:
Без знакове
Знакове
CF
OF
11110110
246
-10
10001001
137
-119
01111111
127
+127
1
1
(неправильно)
(неправильно)
Таким чином, перенос, що може виникати при додаванні найстарших слів, слід трактувати для беззнакових даних як значущий біт і враховувати його в загальній сумі, а для знакових, вважати ознакою від’ємного числа.
Команда ADC виконує додавання з врахуванням переносу. Тобто якщо прапорець CF має значення 1, то ця команда додає 1 до першого операнду, а вже потім додає другий операнд.
Команда SBB виконує віднімання з запозиченням. Тобто якщо прапорець CF має значення 1, то ця команда спочатку віднімає 1 від першого операнду, а вже потім віднімає від нього другий операнд.
Команда INC/DEC додає / віднімає одиницю до байту або слова в регістрі або пам’яті.
Команда CMP виконує операцію порівняння двох полів даних. Фактично, ця команда виконує віднімання другого операнду від першого, але значення операндів на змінює. Операнди повинні бути однакової довжини: байт або слово. Команда може мати наступний формат:
CMP регістр-регістр;
CMP пам'ять-регістр;
CMP безпосереднє значення -регістр;
CMP регістр-пам’ять;
CMP безпосереднє значення –пам’ять
Команда NEG змінює війкове значення з додатного на від’ємне і з від’ємного на додатне. Фактично, вона віднімає операнд від нуля і додає одиницю.
Лістинг програми:
DOSSEG
.MODEL SMALL
.STACK 100h
.DATA
K_Ml EQU 0E0ACh
K_St EQU 7075h
B dd 38A221B8h
C dw 7878h
D dw 7012h
E db 12h
F dw 1412h
Temp1 dw 00h,00h ;D*F 8C94944
Temp2 dw 00h,00h ;K+B/C 70765905
Temp3 dw 00h,00h ;D*F-E 8C94932
X dw 00h,00h ;result 67AD0FD3
.CODE
start:
mov ax,@data
mov ds,ax
;d*f-e
mov ax,D
mul F
mov [Temp1+0], ax
mov [Temp1+2], dx
mov ax,0
mov ax,word ptr[Temp1]
mov bh,00
mov bl,E
sub ax,bx
sbb word ptr[Temp1+2],0 ; віднімання з переносом
mov word ptr[Temp3+0],ax ; результат в темп 3
mov word ptr[Temp3+2],dx ; результат в темп 3
;k+b/c
mov ax,0
mov ax,word ptr[B]
mov dx,word ptr[B+2]
div C
mov dx,K_St
add ax,K_Ml
mov [Temp2+0],ax
adc dx,0
mov [Temp2+2],dx
; X
mov ax,word ptr[Temp2+0]
mov dx,word ptr[Temp3+0]
sub ax,dx
mov [X],ax
mov ax,word ptr[Temp2+2]
mov dx,word ptr[Temp3+2]
sbb ax,dx
mov [X+2],ax
sbb [X+4],0
mov ah,4Ch
int 21h
end start
end
Результати виконання програми:
/
Висновок я вивчив способи задання констант та змінних в Асемблері та набув навиків використання арифметичних команд над даними різного розміру.