|
Реалізація функцій 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
|
|