Читайте также:
|
|
1. Постановка задачі для конкретного варіанта.
2. Блок-схема алгоритму виконання прикладу з детальним коментарем та описом роботи.
3. Лістинг програми з виведенням даних на екран монітора з використанням АРІ-функцій під Win32 та детальним коментарем і описом роботи.
4. Рrint screen екрана 32-розрядного налагоджувача з виконаною програмою.
5. Короткий опис виконання програми.
6. Висновки за результатами роботи.
Приклад 18.2. Виконати паралельне порівняння за допомогою SSE2-команд 2-х масивів по 9 чисел. Якщо один масив менший від другого, то виконати операцію
(a – e) b – d/b, де a = 0,1; b = 1,05; c = 2,1; d = 3,2;
інакше – виконати операцію d/b.
Лістинг 18.3:
title Rysovaniy A.N. & Хмеленко Д., НТУ “ХПІ”, КІТ-17а
.386; директива визначення типу мікропроцесора
.model flat,stdcall; завдання лінійної моделі пам’яті та угоди ОС Windows
.XMM; використання регістрів SSE
option casemap:none; відмінність малих та великих літер
include \masm32\include\windows.inc; файли структур, констант …
include \masm32\macros\macros.asm
uselib kernel32, user32, fpu
BSIZE equ 50
.data
mas1 dd 11.4, 14.02, 9.8, 4.0, 12.14, 1.82, 67.54, 9.95, 7.16; масив №1
len EQU $- mas1
mas2 dd 11.4, 14.02, 3.14, 2.718, 5.0, 45.45, 23.35, 9.95, 79.2; масив №2
rez dd len dup(0); результат порівняння
rez2 dq?; для результату виконання операцій
a1 dd 0.10
b1 dd 1.05
c1 dd 2.10
d1 dd 3.20
buf BYTE BSIZE dup(?)
st1 db "The Rezult mas1!=mas2",0; заголовки вікна повідомлень
st2 db "The Rezult mas1==mas2",0
st3 dd 0
flag db 0
.code
_st:
xor edx,edx
mov eax,len; завантаження 40 байтів масиву
shr eax,2; len/4 = 10 - визначення кількості чисел
mov ebx,4
div ebx; визначення кількості циклів
mov ecx,eax
lea esi,mas1; завантаження масиву №1 в esi
lea edi,mas2; завантаження масиву №2 в edi
xor ebx,ebx
.WHILE(ecx!=0)
movupd XMM0,[esi]; завантаження масиву №1 в регістр XMM0
movupd XMM1,[edi]; завантаження масиву №1 в регістр XMM0
cmppd XMM0, XMM1, 0; виконання паралельного порівняння масивів
movupd rez[ebx],XMM0; збереження результату порівняння
add esi,16; перехід на наступну адресу
add edi,16
add ebx,16
dec ecx
.ENDW
mov ecx,edx; залишок чисел, що не ввійшли до паралельного порівняння
.WHILE(ecx!=0)
movupd XMM0,[esi]; завантаження масиву №1 в регістр XMM0
movupd XMM1,[edi]; завантаження масиву №1 в регістр XMM0
cmpsd XMM0, XMM1,8; виконання скалярного порівняння масивів
movupd rez[ebx],XMM0; збереження результату порівняння
add esi,4; перехід на наступну адресу
add edi,4
add ebx,4
dec ecx
.ENDW
mov ecx,9
xor ebx,ebx
.WHILE(ecx!=0)
.IF (rez[ebx]==0); якщо елементи масивів хоча б один раз не дорівнюють
mov al,1; одне одному, то встановлюємо прапорець в 1
mov flag,al
.ENDIF
dec ecx
inc ebx
.ENDW
.IF (flag==1); якщо масиви не рівні, виконуємо вираз (а-с)b-d/b
finit
fld a1
fsub c1
fmul b1
fld d1
fdiv b1
fsub
fst rez2
lea ebx,st1
.ELSE; якщо ж масиви рівні, то виконуємо d/b
finit
fld d1
fdiv b1
fst rez2
lea ebx,st2
.ENDIF
mov st3, ebx; збереження заголовку вікна
invoke FpuFLtoA,0,10,addr buf,SRC1_FPU or SRC2_DIMM; перетворення чисел
invoke MessageBox, NULL, ADDR buf, st3, MB_OK; виведення на екран
invoke ExitProcess,0
end _st
Результат виконання програми з лістингу 18.2 наведено на рис. 18.11.
Література: Рисований О.М. Системне програмування [Текст]: підручник для студентів напрямку “Компютерна інженерія” вищих навчальних закладів. Видання друге: виправлено та доповнено – Х.: “Слово”, 2011. – 944 с.
Дата добавления: 2014-12-18; просмотров: 34 | Поможем написать вашу работу | Нарушение авторских прав |