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

mov es,di

mov di,offset r

call WORD_TO_REAL

б) перетвореннядійсного в ціле

mov ax,word ptr[I]

mov si,seg r

mov ds,si

mov si,offset r

call REAL_TO_WORD

в) визначення [X]

mov si,seg r

mov ds,si

mov si,offset r

call REAL_TRUNC

г) визначення {X}

mov si,seg r

mov ds,si

mov si,offset r

call REAL_REAL

д) визначення {X}

mov si,seg r

mov ds,si

mov si,offset r

call REAL_ABS


8.ВисновкиОтже, єрозробленою програма, яка виконує операції з дробовими та цілими числами –конвертування, {X} |X| [X]. Був розглянутий формат дійсних чисел, і наведеніалгоритми розв’язку.

9.Використана література

 

1. Ровдо А. А. Микропроцессоры от 8086 до Pentium IIIXeon и AMD-K6-3. М., ДМК, 2000


Додаток.Лістинг програми

.model small

.stack 100

.486

.data

f dd 0

.code

start:

jmp begin

;------------------------------------------------------------

; обчисленняфункцiї ABS(x) — DS:SI — REAL

REAL_ABS proc

push bx

mov bh,byte ptrds:[si+3]

and bh,7fh

mov byte ptrds:[si+3],bh

pop bx

ret

REAL_ABS endp

;------------------------------------------------------------

; конвертор REAL вDS:SI в WORD (AX)

REAL_TO_WORD proc

jmp start_proc

x dw 0; тимчасовийпараметр AX

start_proc:

pusha

;1)видiлитиокремо знак, порядок i мантису

; bh — знак, bl — порядок, ax — мантиса

mov bh,byte ptrds:[si+3]

and bh,80h; видiлилизнак

mov bl,byte ptrds:[si+3]

shl bl,1

mov ah,byte ptrds:[si+2]

shr ah,7

or bl,ah; видiлилипорядок

mov ah,byte ptrds:[si+2]

mov al,byte ptrds:[si+1]

shl ax,1; видiлилимантису

cmp bl,127; перевiркана нуль

jb res_zero

sub bl,127

mov cl,15

sub cl,bl ;cl-кiлькiстьзсувiв вправо мантиси

stc; старшийрозряд завжди 1

rcr ax,1

shr ax,cl

mov word ptrcs:[x],ax ;… i отримаємо результат!

cmp bh,0; враховуємознак

je res_ok

neg ax

mov word ptrcs:[x],ax

jmp res_ok

res_zero:

mov word ptrcs:[x],0

res_ok:

popa

mov ax,word ptrcs:[x]

ret

REAL_TO_WORD endp

;---------------------------------------------------------------

; конвертор16-бiтного слова в AX в коротке дiйсне es:di (4 байта)

WORD_TO_REAL proc

pusha

; нуль?

cmp ax,0

jne no_zero

mov dword ptres:[di],0

popa

ret

no_zero:

push di

;1) якщо d15=1 — bh=80h (знак), iнакше bh=0

xor bh,bh

test ax,8000h

jz plus

neg ax

mov bh,80h

plus:

;2)зсунути AXвлiво так, щоб старша одиниця була в CF.

; пiдрахуватикiлькiсть зсувiв

xor di,di

mov cx,16

shift: inc di

shl ax,1

jc stop_shift

loop shift

stop_shift:

;3)обчислитипорядок: bl=127+16-di

mov cx,di

mov bl,127+16

sub bl,cl

pop di

; отже, маємо:bh-знак,bl-порядок,ax-мантиса

; ставимонайстарший байт (3) в 0

mov byte ptres:[di],0

; ставимо молодшийбайт: знак+7 старших бiтiв порядку

mov dl,bh

push bx

shr bl,1

or dl,bl

pop bx

mov byte ptres:[di+3],dl

; ставимо 1-йбайт: останнiй байт порядку i 7 ст байт мантиси

and bl,1

shl bl,7

shr ax,1

or bl,ah

mov byte ptres:[di+2],bl

; ставимо 2-йбайт: молодшi 8 байт мантиси

mov byte ptres:[di+1],al

popa

ret

WORD_TO_REAL endp

;------------------------------------------------------------

; обчисленняфункцiї [X] — DS:SI — REAL

REAL_TRUNC proc

push ax

call REAL_TO_WORD

call WORD_TO_REAL

pop ax

ret

REAL_TRUNC endp

;------------------------------------------------------------

; обчисленняфункцiї {X} — DS:SI — REAL

REAL_REAL proc

push eax

push edx

push bx

push cx

; в EDX записати узворотньому порядку число

mov dh,byte ptrds:[si+3]

xor bh,bh

mov bl,dh

shl bl,1

adc bh,0

shl bh,7

mov dl,byte ptrds:[si+2]

mov ah,dl

and ah,80h

shr ah,7

or bl,ah; в BH — знак, в BL — порядок, в EDX — число

shl edx,16

mov dh,byte ptrds:[si+1]

mov dl,byte ptrds:[si]

cmp bl,127

jb stop_tr; цевже число <0!

shl edx,9; прибративсе зайве (знак i порядок)

sub bl,127; кiлькiстьзсувiв (бiтiв з цiлою частиною)

mov cl,bl

shl edx,cl; вiдкинутицiлу частину

; зараз в EDX — дробова частина

; тепер обчислюємопорядок

mov bl,127

shift_l:

dec bl

shl edx,1

jnc shift_l; отже,тепер порядок в bl, а в edx готова мантиса

; тепер зсунутиEDX вправо на 9

shr edx,9

xor eax,eax

mov al,bh

shl eax,1

or al,bl

shl eax,23

or edx,eax ;iкомбiнуємо!

; тепер записати впам`ять

mov byte ptrds:[si],dl

mov byte ptrds:[si+1],dh

shr edx,16

mov byte ptrds:[si+2],dl

mov byte ptrds:[si+3],dh

stop_tr:; вихiд

pop cx

pop bx

pop edx

pop eax

ret

REAL_REAL endp

;------------------------------------------------------------

begin:

mov ax,@data

mov es,ax

mov ds,ax

mov di,offset f

mov si,offset f

;mov ax,-32768

;callWORD_TO_REAL

;fst dword ptres:[di]

;call REAL_TRUNC

fst dword ptres:[di]

;callREAL_TO_WORD

call REAL_REAL

fld dword ptres:[di]

mov ah,4ch

int 21h

end start

еще рефераты
Еще работы по информатике, программированию