|
Реалізація функцій ABS(X), [X], {x}
Реалізація функцій 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_ABS8. ВисновкиОтже, є розробленою програма, яка виконує операції з дробовими та цілими числами - конвертування, {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
|
|