Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Kolokvium_z_OOP_2010_vsi.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
133.27 Кб
Скачать
  1. Обробка даних в арифметиці з плаваючою комою (робота копроцесора fpu)

Для обробки дійсних чисел існує FPU(Floating Point Unit). Він має свої команди(починаються буквою F), регістри, принципи.

Математичний копроцесор (FPU) обробляє три формати чисел з плаваючою комою:ординарної, подвійної та розширеної точності. Ці числа називають відповідно:

  • коротким дійсним(7 знаків після коми)

  • подвійним дійсним(15 знаків після коми)

  • розширеним дійсним(19 знаків після коми)

Кожне число цих форматів містить три поля: знак числа, порядок і мантиса. В оперативній пам’яті, залежно від формату, ці числа займають відповідно 4, 8, 16 байт. Байт із найменшою адресою є наймолодшим байтом мантиси, наступними є більш значущі байти мантиси,за ними розташовані байти порядку від наймолодшого до найстаршого. Останній байт числа містить 7 біт порядку та однобітне поле числа. Нуль у знаковому біті означає, що число додатне, 1 – від’ємне.

порядок

мантиса

31 22 0

Поле порядку визначає степінь числа 2, на яку потрібно помножити мантису, щоб отримати зазначене число з плаваючою комою. Щоб опрацювати число з від’ємними порядками у полі порядку постійно знаходиться не справжній порядок числа, а сума цього порядку і деякої додатної константи – так званого зміщення.

Для ординарної точності 127, для подвійної 1023, для розширеної 16 383.

Копроцесор містить 13 власних регістрів:

  • 8 80-розрядних регістрів FPU зі стековою формою організації;

  • 5 службових регістрів

Регістри FPUоб’єднані у стек, вершину якого називають ST або ST(0). Нижні елементи відповідно ST(1),…,ST(7). Під час запису чисел в регістри вершина стека може рухатись вниз або вгору.

Для використання команд копроцесора, потрібно його ініціювати командою FINIT. Приклади команд FPU:

  • FLDзавантажує нуль в вершину стеку

  • FILD завантажує ціле число у вершину стеку

  • FSIN обчислює в радіанах синус кута

  • FADD додає два числа

  • FMUL перемножує два числа

  1. Заповнити таблицю за результатами роботи програми DemoFpu.

Дану цікаву задачу таблицями не опишу, бо це нічого не дасть(їх було б 4*13+5). Тому коментую команди у цій прозі а далі «хто во што гаразд»

Початок сегменту даних, N к-сть витків циклу, х,у масиви, в одному проходженні циклу реально використовується пара відповідних х та у

x DD 1., 2., 3., 4.

Y DD 2., 4., 6., 8.

N DW 4

CODESEG

START: mov ax, @data ;

mov ds,ax ; datasegment

mov cx,[N]

FINIT

FLDZзаписується нуль в вершину стеку ST(0)=ST

FLDZST(0)ST(1),ST(0) записується 0

FLDZST(1)ST(2),ST(0)ST(1),ST(0) записується 0

FLDZST(2)ST(3),ST(1)ST(2),ST(0)ST(1),ST(0) записується 0

FLDZST(3)ST(4),ST(2)ST(3),ST(1)ST(2),ST(0)ST(1),ST(0) записується 0

Далі іде настроювання,яке нічого не міняє в стеку

XOR SI,SI

lea AX,[X]

MOV BX,DS

ADD AX,BX

MOV ES,AX

Цикл

NACH: FLD [DWORD PTR ES:SI]-в вершину стеку заноситься х(при першому проходженні це 1 при другому 2[x DD 1., 2., 3., 4.])

FADD ST(5),ST–ST(0)*ST(5) і запис. в ST(5)

FLD ST(0)в вершину стеку заноситься х

FMUL ST,ST(0)–добуток вершини стеку саму на себе

FADDP ST(4),ST – додати їх,результат в ST(4),штовхнути вверх(ST(4)ST(3) і т.д.)

FLD [DWORD PTR DS:SI+010h]в вершину стеку заноситься у (при першому проходженні це 2 при другому 4[у DD 2., 4., 6., 8.])

FADD ST(5),ST --ST(0)*ST(5) і запис. в ST(5)

FLD ST(0)в вершину стеку заноситься у

FMUL ST,ST(0)добуток вершини стеку саму на себе

FADDP ST(4),STдодати їх,результат в ST(4),штовхнути вверх(ST(4)ST(3) і т.д.)

FMULсудяподебагеру буде так:ST(1)*ST(0) і штовхнути вверх

FADDсудяподебагеру буде так:ST(1)+ST(0) і штовхнути вверх

ADD SI,4—забезпечує перехід до наст. пари х,у

LOOP NACH–крутити цикл

FSTP [CXY]---виштовхує вершину в змінну CXY

FSTP [ SY]---виштовхує вершину в змінну SY

FSTP [ SX]---виштовхує вершину в змінну SX

FSTP [ MY]---виштовхує вершину в змінну MY

FSTP [ MX]---виштовхує вершину в змінну MX

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]