|
Реалізація функцій ABS(X), [X], {x} |
Реалізація функцій ABS(X), [X], {x}
4 Міністерство освіти та науки України Кіровоградський Державний Технічний університет Кафедра програмного забезпечення Курсова робота з дисципліни “Програмування на мові 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 функцій. Розглянемо приклади їх викликів.Необхідно описати такі дані:rdd0; дійсне числоIdw0; ціле числоа) перетворення цілого в дійсне: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_ABS8. ВисновкиОтже, є розробленою програма, яка виконує операції з дробовими та цілими числами - конвертування, {X} |X| [X]. Був розглянутий формат дійсних чисел, і наведені алгоритми розв'язку.9. Використана літератураРовдо А.А. Микропроцессоры от 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
|
|
|
© 2003-2013
Рефераты бесплатно, курсовые, рефераты биология, большая бибилиотека рефератов, дипломы, научные работы, рефераты право, рефераты, рефераты скачать, рефераты литература, курсовые работы, реферат, доклады, рефераты медицина, рефераты на тему, сочинения, реферат бесплатно, рефераты авиация, рефераты психология, рефераты математика, рефераты кулинария, рефераты логистика, рефераты анатомия, рефераты маркетинг, рефераты релиния, рефераты социология, рефераты менеджемент. |
|
|