Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

гос / sp-lect (1)

.pdf
Скачиваний:
18
Добавлен:
16.02.2016
Размер:
2.59 Mб
Скачать

include masm32.inc

include C:\MASM32\MACROS\strings.mac

includelib

user32.lib

includelib

kernel32.lib

includelib

masm32.lib

Main

PROTO

.data

 

eps

dq 1.0E-15

a

dq 0.0

.data?

 

b

dq ?

x

dq ?

fx

dq ?

; Файл dichotomy.asm

.586

.model flat, stdcall option casemap:none include dichotomy.inc

.code

start:

invoke Main

invoke ExitProcess,0

Main proc

LOCAL Buffer[128]:BYTE

invoke AllocConsole lea esi,Buffer

invoke CharToOem, $CTA0("Метод діхотомії"), esi invoke SetConsoleTitle,esi

invoke ClearScreen

finit

 

fld eps

; eps

fld1

; 1, eps

fld1

; 1, 1, eps

fadd

; 2,eps

fld a

; a,2,eps

fld st(1)

; 2,a,2,eps

fldpi

; pi,2,a,2,eps

fdivr

; b=pi/2,a,2,eps

next:

; b,a,2,eps

fld st(0)

; b,b,a,2,eps

fsub st(0),st(2)

; b-a,b,a,2,eps

fabs

;|b-a|,b,a,2,eps

fcomip st(0),st(4)

; b,a,2,eps

jc OK

; st(0)<st(i) => ZF=PF=0, CF=1

fld st(0)

; b,b,a,2,eps

fadd st(0),st(2)

; b+a,b,a,2,eps

fdiv st(0),st(3)

; c=(b+a)/2,b,a,2,eps

fld st(0)

; c,c,b,a,2,eps

call function

; f(c),c,b,a,2,eps

ftst

; f(c),c,b,a,2,eps

fstsw ax

; B C3 TOP C2 C1 C0

test ax,4500h

; 0 1 000 1 0 1 00000000b

fstp st(0)

; c,b,a,2,eps

jz @F

; C3=C2=C0=0 => st(0)>0

fstp st(2)

; b,a=c,2,eps

jmp next

; b,a,2,eps

@@: fstp st(1)

; b=c,a,2,eps

jmp next

; b,a,2,eps

OK: fadd

; b+a,2,eps

fdivr

; x=(b+a)/2,eps

fld st(0)

; x,x,eps

call function

; f(x),x,eps

fstp fx

; x,eps

fstp x

; eps

fstp st(0)

mov word ptr [esi],"(f" lea esi,[esi+2]

invoke FloatToStr,x,esi invoke lstrlen,esi

mov dword ptr [esi+eax]," = )" lea esi,[esi+eax+4]

invoke FloatToStr,fx,esi invoke StdOut,ADDR Buffer invoke CharToOem,

$CTA0("\n\nНатиснiть Enter для завершення..."), esi invoke StdOut,esi

invoke StdIn,esi, 4

ret

Main endp function proc

;f(x)= cos(x)-sqrt(x)

;вхід : x в st(0)

;вихід : f(x) в st(0)

fld st(0)

; x, x

 

 

 

 

 

 

 

 

 

 

 

 

 

fsqrt

;

 

x , x

 

 

 

 

; x,

 

 

 

 

 

 

 

fxch

 

 

x

 

 

 

 

; cos x ,

 

 

 

fcos

x

 

; cos x

 

 

fsub

 

x

ret

 

 

 

 

 

 

 

 

 

function endp end start

9 ПРОГРАМУВАННЯ РОЗШИРЕННЯ MMX

Розширення MMX мікропроцесорів Intel64 являє собою програмно- апаратне доповнення архітектури мікропроцесора, що надає їй нові властивості, які забезпечують більш високу продуктивність мультимедійних додатків в

системах обробки і передавання даних. Вперше це розширення зявилося у 1997 році в мікропроцесорах Intel© Pentium MMX™, а надалі стало стандартом для усіх наступних моделей мікропроцесорів та отримало подальший розвиток.

9.1 Програмна модель розширення MMX

Під програмною моделлю розширення MMX традиційно маємо на увазі його організацію з точки зору можливостей програмування. Рисунок 9.1 відображає складові програмної моделі розширення MMX.

Рисунок 9.1

Зважаючи на те, що MMX є розширенням, тобто складовою частиною основного процесору, в контексті його програмної моделі не розглядаються режими роботи, які воно «успадковує» від основного процесору і тому вони не представлені на рисунку.

Зважаючи на те, що розширення MMX є складовою частиною основного процесору, способи організації і адресації памяті для них не розрізняються. Вони представлені на рисунку тому, що в системі команд MMX є команди, які передбачають використання операндів в памяті і для них використовуються відомі вже з попередніх розділів курсу способи адресації.

9.2 Типи оброблюваних даних

На апаратному рівні MMX-команди підтримують єдиний тип даних – 64- розрядні зчетверені слова, однак логічна інтерпретація цього апаратно підтримуваного типу в залежності від команди може бути різна. Рисунок 9.2 демонструє усі типи даних розширення MMX.

Рисунок 9.2

Характерною рисою MMX-розширення є векторність, під якою мається на увазі те, що 64-розрядний пакет бітів інтерпретується як набір декількох компонентів (координат вектора), які можуть оброблятися MMX-командами паралельно і не залежно одна від одної. Такі векторні типи даних називають пакованими, а компоненти векторів в MMX-розширенні інтерпретуються тільки як знакові або без знакові цілі числа.

9.3 Склад, розрядність і призначення регістрів

Як апаратний ресурс для обробки 64-розрядних операндів в розширенні MMX використовуються 64 молодші біти 80-розрядних регістрів стеку математичного співпроцесору R0-R7 (Рисунок 9.3). Команди розширення MMX використовують регістри R0-R7 не як апаратний стек, а як звичайну регістрову память з довільним доступом, звертаючись до регістрів за іменами MM0-MM7. Жоден з регістрів MMX не має певного спеціалізованого призначення і всі вони використовується як апаратний ресурс для обробки даних.

Рисунок 9.3

Зважаючи на те, що математичний співпроцесор і розширення MMX використовують одні й ті самі апаратні ресурси, використання в коді суміші команд FPU і команд MMX практично неможливе, але вони можуть використовуватися по черзі в окремих блоках зі збереженням, за необхідності, результатів роботи окремих блоків в памяті. Блок MMX-команд повинен завершуватися командою без операндів EMMS.

9.4 Система команд MMX

При вивченні системи команд MMX ми традиційно розподілимо їх на декілька груп (Рисунок 9.4), і будемо розглядати окремо по групах. Кожна наступна група команд, зображених на рисунку в порядку зліва направо, розширюватиме наші можливості програмування.

Рисунок 9.4 Перед тим як безпосередньо перейти до розгляду системи команд

розширення MMX, слід зробити деякі зауваження, щодо їх загальних особливостей. Рисунок 9.5 демонструє принцип векторної обробки, характерної для більшості MMX-команд.

Рисунок 9.5

Команда обробки виконує попарно визначену операцію «» паралельно і не залежно над відповідними елементами вектор-операндів і розміщує результат у відповідних елементах одного із операндів: Пi ← Пi Дi (i=1..n).

Особливістю арифметичних команд і деяких команд перетворення є те, що вони виконують обробку або за правилами циклічної арифметики (wraparound arithmetic) або за правилами арифметики із насиченням (saturation

arithmetic).

За правилами циклічної арифметики (арифметики з циклічним переносом), якщо довжина розрядної сітки, потрібної для розміщення результату операції перевищує довжину розрядної сітки вихідних операндів, то біти результату що виходять за розрядну сітку відкидаються.

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

9.4.1 Команди пересилання

Команди пересилання дозволяють завантажувати операнди з памяті для їх подальшої обробки з використанням MMX-команд, зберігати результати обробки в памяті, переміщувати дані поміж MMX-регістрами та поміж MMX- регістрами і регістрами загального призначення:

MOVD mm,r32 / m32

D MOVD r32 / m32,mm MOV Q <приймач>,<джерело>= MOVQ mm,r64 / m64

MOVQ r64 / m64,mm

Команда MOVD працює тільки з 32-ма молодшими розрядами MMX- регістра і якщо MMX-регістр виступає у ролі приймача, то його старші 32 біта заповнюються нулями.

9.4.2Команди перетворення

Вгрупі команд перетворення типів можна виділити дві підгрупи команди упаковки і команди розпаковки. Наявність команд цієї групи повязана

зособливостями виконання арифметичних MMX-команд.

До команд упаковки належать PACKSSWB, PACKUSWB і PACKSSDW.

Рисунок 9.6 демонструє загальний алгоритм виконання команд PACKSSWB/PACKUSWB з узагальненим позначенням

PACKSSWB mm,mm

PACK SS WB < Приймач >,< Джерело >= PACKSSWB mm,m64 .

US

PACKUSWB mm,mm

PACKUSWB mm,m64

Рисунок 9.6

Команди PACKSSWB і PACKUSWB відрізняються лише тим, як вони інтерпретують компоненти векторів операндів у вихідному стані. Команда PACKSSWB виконує пакування із знаковим насиченням, а команда PACKUSWB – з без знаковим.

Команда PACKSSDW mm,mm / m64 виконує пакування із знаковим насиченням за алгоритмом, аналогічним командам PACKSSWB і PACKUSWB

Рисунок 9.7

Узагальнене позначення команд розпаковки має вигляд

 

 

PUNPCKHBW mm,mm / m64

 

 

 

BW

PUNPCKHWD mm,mm / m64

H

 

PUNPCKHDQ mm,mm / m64

PUNPCK WD

< Приймач >,< Джерело >=

L

 

PUNPCKLBW mm,mm / m64

DQ

PUNPCKLWD mm,mm / m64

 

 

 

 

 

PUNPCKLDQ mm,mm / m64

Командам

цієї

групи не притаманні особливості ані циклічної, ані

арифметики з насиченням і вони просто займаються переміщенням компонентів векторів операндів. Рисунок 9.8 демонструє алгоритм виконання команди PUNPCKHBW, а Рисунок 9.9 – команди PUNPCKHLW.

Рисунок 9.8

Рисунок 9.9 Алгоритми інших команд розпаковки аналогічні вищенаведеним. Вони

збирають подвійні слова зі слів (WD) та зчетверене слово з подвійних слів (DQ) обираючи потрібні компоненти зі старшої (H) або молодшої (L) половини операндів.

9.4.3 Арифметичні команди

Команди з узагальненим позначенням

 

 

B

 

P

 

ADD

W

 

< приймач >,< джерело >

 

 

 

 

 

 

 

SUB

 

 

 

 

 

D

 

виконують операції додавання і вирахування над відповідними елементами приймача і джерела за правилами циклічної арифметики і

розміщують результат у відповідних елементах приймача. Символи «B», «W» і «D» в мнемонічному позначенні команди указують на тип компонентів байт, слово і подвійне слово, відповідно. Приймачем може бути тільки MMX-регістр, а джерело може розміщуватися як у MMX-регістрі так і в памяті.

Команди з узагальненим позначенням

 

ADD S

B

< приймач >,< джерело >

P

 

 

SUB US W

 

виконують операції додавання і вирахування над відповідними елементами приймача і джерела за правилами арифметики із знаковим (S) та без знаковим (US) насиченням і розміщують результат у відповідних елементах приймача. Символи «B» і «W» в мнемонічному позначенні команди указує на тип компонентів байт і слово, відповідно. Приймачем може бути тільки MMX-регістр, а джерело може розміщуватися як у MMX-регістрі так і в памяті.

Команди з узагальненим позначенням

PMUL H W < приймач >,< джерело >

L

виконують попарне знакове множення слів приймача і джерела і розрізняються лише тим, як зберігають результат. Команда із символом «L» в мнемонічному позначенні зберігає у відповідних словах приймача 16 молодших, а команда із символом «H» – 16 старших розрядів результату. Приймачем може бути тільки MMX-регістр, а джерело може розміщуватися як у MMX-регістрі так і в памяті.

Соседние файлы в папке гос