Реалізація функцій ABS(X), [X], {x}
Міністерство освіти та науки України
Кіровоградський Державний Технічний університет
Кафедра програмного забезпеченняКурсова роботаз дисципліни “Програмування на мові ASM-86” на тему:
Реалізація функцій ABS(X), [X], {x}ЗМІСТ1. Вступ2. Постановка задачі3. Обґрунтування вибору методів розв'язку задачі4. Алгоритм програми.5. Реалізація програми6. Системні вимоги7. Інструкція для користувача8. Висновки9. Використана літератураДодаток. Лістинг програми
1. ВступУ процесі роботи з комп'ютером виникає необхідність роботи з різними видами даних. Так, наприклад, мови високого рівня можуть працювати з цілими, дробовими числами, символами, рядками і т.д. Програмуючи на мові асемблера, найчастіше маємо справу з цілими числами. Стандартні розміри чисел такі: 8-розрядні (байти), 16-розрядні (слова), 32-розрядні (подвійні слова). У пам'яті вони записуються послідовно, починаючи з молодшого байта.
Також в асемблері є можливість роботи з дробовими числами. Для роботи з ними використовується математичний сопроцесор або його емулятор (він входить до складу основного процесора починаючи з 486DX). Цей сопроцесор оперує з цілими числами та з числами з плаваючою комою. Використовуються 32-, 64- та 80-розрядні формати запису чисел. Наприклад, формат 32-бітного дробового числа має такий формат (тип float в С, REAL в PASCAL):
Найстарший біт - знак мантиси (0- “+”, 1- “-“).
Далі - 8 розрядів порядку, до якого додано 127.
Потім - 23-розрядна мантиса.
Отже, з цими числами можуть робити різні операції як сопроцесор, так і основний процесор.
2. Постановка задачі
Необхідно створити програму, яка б перетворювала ціле число в дробове і навпаки, а також функції [x], {x}, |X|.
3. Обґрунтування вибору методів розв'язку задачі
У зв'язку з тим, що не на кожній машині присутній сопроцесор, то програма буде оперувати з 32-розрядними числами з плаваючою комою, які розташовані у простій пам'яті. Вони матимуть стандартний запис, і тому з ними може проводити роботу і сопроцесор, і програми, які його замінюють.
Робота буде полягати в конвертуванні бітів у числах і деяких обчисленнях. Для цього використовуються команди мови асемблер передачі інформації, обчислень, зсувів та логіки. Також, для демонстрації роботи програми використовується завантаження даних в регістри сопроцесора (fld, fst).
4. Алгоритм програми
а) Алгоритм перетворення цілого числа в дійсне
1. Обчислити знак числа, якщо число від'ємне - обернути його.
2. Записати число без знака у вигляді мантиси.
3. Взяти початкове значення порядку - 127.
4. Зсувати мантису вліво до тих пір, поки старший біт не стане рівним 1. Зсунути ще раз (старший біт мантиси ігнорується). Збільшити порядок на кількість зсувів.
5. Скомбінувати отримані знак, мантису і порядок у відповідності з форматом.
б) Алгоритм переведення числа з дійсного в ціле
1. Визначити знак дійсного числа.
2. Визначити мантису і порядок
3. Від порядку відняти 127 - це дорівнює Х.
4. Зсунути мантису на Х вправо - це і буде ціле число.
в) Функція [Х]
1. Перетворити дійсне число в ціле
2. Результат знову перетворити в дійсне
г) Функція |X|
1. Поставити в 0 знак мантиси дробового числа
д) Функція {X}
1. Виділити цілу і дробову частину (аналогічно як при переведенні дійсного в ціле) і відкинути цілу.
2. Взяти порядок рівний 127.
3. Зсувати мантису вліво поки старший біт рівний 1 не вийде за межі мантиси.
4. Зменшити порядок на кількість зсувів.
5. Записати результат у відповідний формат.
5. Реалізація програми
Програма написана на мові ASM-86 з використанням команд сопроцесора та команд процесора 286/386. Вона складається з функцій, які мають цілі вхідні та вихідні дані в регістрі AX, а дробові дані - за адресою DS:SI та ES:DI. Для роботи необхідно записати у відповідні регістри дані або їх адреси, викликати функції і прочитати результат з вказаного місця.
Програма компілюється Turbo Assembler, зв'язується за допомогою TLINK.
6. Системні вимоги- Математичний сопроцесор (для демонстрації)
- Мікропроцесор Intel 80386 або старший.
- Для перегляду результатів - Turbo Debugger або інший відлагоджувач.
7. Інструкція для користувачаПрограма для роботи з числами містить 5 функцій. Розглянемо приклади їх викликів.Необхідно описати такі дані:r dd 0 ;дійсне числоI dw 0 ;ціле числоа) перетворення цілого в дійсне:mov ax,word ptr [I]mov di,seg rmov es,dimov di,offset rcall WORD_TO_REALб) перетворення дійсного в цілеmov ax,word ptr [I]mov si,seg rmov ds,simov si,offset rcall REAL_TO_WORDв) визначення [X]mov si,seg rmov ds,simov si,offset rcall REAL_TRUNCг) визначення {X}mov si,seg rmov ds,simov si,offset rcall REAL_REALд) визначення {X}mov si,seg rmov ds,simov si,offset rcall REAL_ABS
8. ВисновкиОтже, є розробленою програма, яка виконує операції з дробовими та цілими числами - конвертування, {X} |X| [X]. Був розглянутий формат дійсних чисел, і наведені алгоритми розв'язку.9. Використана література1. Ровдо А. А. Микропроцессоры от 8086 до Pentium III Xeon и AMD-K6-3. М., ДМК, 2000
Додаток. Лістинг програми.model small.stack 100.486.dataf dd 0.codestart:jmp begin;------------------------------------------------------------;обчислення функцiї ABS(x) - DS:SI - REALREAL_ABS procpush bxmov bh,byte ptr ds:[si+3]and bh,7fhmov byte ptr ds:[si+3],bhpop bxretREAL_ABS endp;------------------------------------------------------------;конвертор REAL в DS:SI в WORD (AX)REAL_TO_WORD procjmp start_procx dw 0 ;тимчасовий параметр AXstart_proc:pusha;1)видiлити окремо знак, порядок i мантису; bh - знак, bl - порядок, ax - мантисаmov bh,byte ptr ds:[si+3]and bh,80h ;видiлили знакmov bl,byte ptr ds:[si+3]shl bl,1mov ah,byte ptr ds:[si+2]shr ah,7or bl,ah ;видiлили порядокmov ah,byte ptr ds:[si+2]mov al,byte ptr ds:[si+1]shl ax,1 ;видiлили мантисуcmp bl,127 ;перевiрка на нульjb res_zerosub bl,127mov cl,15sub cl,bl ;cl-кiлькiсть зсувiв вправо мантисиstc ;старший розряд завжди 1rcr ax,1shr ax,clmov word ptr cs:[x],ax ;... i отримаємо результат!cmp bh,0 ;враховуємо знакje res_okneg axmov word ptr cs:[x],axjmp res_okres_zero:mov word ptr cs:[x],0res_ok:popamov ax,word ptr cs:[x]retREAL_TO_WORD endp;---------------------------------------------------------------;конвертор 16-бiтного слова в AX в коротке дiйсне es:di (4 байта)WORD_TO_REAL procpusha;нуль?cmp ax,0jne no_zeromov dword ptr es:[di],0poparetno_zero:push di;1) якщо d15=1 - bh=80h (знак), iнакше bh=0xor bh,bhtest ax,8000hjz plusneg axmov bh,80hplus:;2)зсунути AX влiво так, щоб старша одиниця була в CF.; пiдрахувати кiлькiсть зсувiвxor di,dimov cx,16shift: inc dishl ax,1jc stop_shiftloop shiftstop_shift:;3)обчислити порядок: bl=127+16-dimov cx,dimov bl,127+16sub bl,clpop di;отже,маємо:bh-знак,bl-порядок,ax-мантиса;ставимо найстарший байт (3) в 0mov byte ptr es:[di],0;ставимо молодший байт: знак+7 старших бiтiв порядкуmov dl,bhpush bxshr bl,1or dl,blpop bxmov byte ptr es:[di+3],dl;ставимо 1-й байт: останнiй байт порядку i 7 ст байт мантисиand bl,1shl bl,7shr ax,1or bl,ahmov byte ptr es:[di+2],bl;ставимо 2-й байт: молодшi 8 байт мантисиmov byte ptr es:[di+1],alpoparetWORD_TO_REAL endp;------------------------------------------------------------;обчислення функцiї [X] - DS:SI - REALREAL_TRUNC procpush axcall REAL_TO_WORDcall WORD_TO_REALpop axretREAL_TRUNC endp;------------------------------------------------------------;обчислення функцiї {X} - DS:SI - REALREAL_REAL procpush eaxpush edxpush bxpush cx;в EDX записати у зворотньому порядку числоmov dh,byte ptr ds:[si+3]xor bh,bhmov bl,dhshl bl,1adc bh,0shl bh,7mov dl,byte ptr ds:[si+2]mov ah,dland ah,80hshr ah,7or bl,ah ;в BH - знак, в BL - порядок, в EDX - числоshl edx,16mov dh,byte ptr ds:[si+1]mov dl,byte ptr ds:[si]cmp bl,127jb stop_tr ;це вже число <0!shl edx,9 ;прибрати все зайве (знак i порядок)sub bl,127 ;кiлькiсть зсувiв (бiтiв з цiлою частиною)mov cl,blshl edx,cl ;вiдкинути цiлу частину;зараз в EDX - дробова частина;тепер обчислюємо порядокmov bl,127shift_l:dec blshl edx,1jnc shift_l ;отже, тепер порядок в bl, а в edx готова мантиса;тепер зсунути EDX вправо на 9shr edx,9xor eax,eaxmov al,bhshl eax,1or al,blshl eax,23or edx,eax ;i комбiнуємо!;тепер записати в пам`ятьmov byte ptr ds:[si],dlmov byte ptr ds:[si+1],dhshr edx,16mov byte ptr ds:[si+2],dlmov byte ptr ds:[si+3],dhstop_tr: ;вихiдpop cxpop bxpop edxpop eaxretREAL_REAL endp;------------------------------------------------------------begin:mov ax,@datamov es,axmov ds,axmov di,offset fmov si,offset f;mov ax,-32768;call WORD_TO_REAL;fst dword ptr es:[di];call REAL_TRUNCfst dword ptr es:[di];call REAL_TO_WORDcall REAL_REALfld dword ptr es:[di]mov ah,4chint 21hend start