Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //Tomasz Kontek 160553
- #include <stdio.h>
- extern float* XYZ2R(float * tablCIEXYZ,int n);
- int main() {
- float * wsk;
- float tab[12] = {
- 1.0, 2.0, 3.0,
- 1.5, 2.5, 3.5,
- 4.5, 2.5, 5.0,
- 0.5, 10.0, 0.75
- };
- int rozmiar = sizeof(tab) / sizeof(tab[0]);
- for (int i = 0; i < (rozmiar/3); i++) {
- printf("%f ||| %f ||| %f \n", tab[ 3*i ],tab[3*i + 1],tab[3*i + 2]);
- }printf("\n\n");
- wsk = tab;
- wsk = XYZ2R(wsk, (rozmiar / 3) );
- for (int i = 0; i < (rozmiar / 3); i++) {
- printf("%f ||| %f ||| %f \n", wsk[3*i], wsk[3*i + 1], wsk[3*i + 2]);
- }printf("\n\n");
- getchar();
- return 0;
- }
- ///////////////////////////////////////////////////////////////////////
- ; 1 - wskaźnik do liczby typu float będzie zwracany przez eax
- .686
- .model flat
- public _XYZ2R
- extern _malloc :PROC
- .data
- wynik dd 0.0
- .code
- _XYZ2R PROC
- push ebp
- mov ebp,esp
- push ebx
- push esi
- push edi
- mov esi,[ebp +8] ; ESI = Adres tablicy
- mov eax,[ebp + 12] ; EAX = n /3 n to liczba elemntów tablicy
- mov edx,12 ; Aby wyliczyć liczbę bajtów które musi przyjąć _malloc
- ; muszę drugi parametr znajdujący się teraz w eax pomnożyć przez 3
- ; wtedy mam liczbę danych typu float w tablicy,
- ; i jeszczepomnożyć razy 4, ponieważ float ma 4 bajty
- mul edx ; EAX = liczba bajtów dla funkcji malloc
- push edx
- call _malloc ; EAX = adres zarezerwowanej pamięci,czyli naszej nowej tablicy, już do końca programu go nie zmieniam
- add esp,4
- mov ecx,[ebp+12] ; ECX = n /3
- push eax ; Zapiszę adres na później, ponieważ w pętli będę go zmieniał
- poczatekPetli:
- finit ; Możliwe że nawet niepotrzebne w tym programie
- push ecx ;ECX pomocniczo
- mov ecx,dword PTR [esi]
- push ecx
- fld dword PTR [esp] ; ST(0)= X
- add esp,4
- add esi,4
- add eax,4
- mov ecx,dword PTR [esi]
- push ecx
- fld dword PTR [esp] ; ST(0) = Y, ST(1) = X
- add esp,4
- mov [eax],ecx ; Przepisanie drugiej liczby z trójki do nowej tablicy
- add esi,4
- add eax,4
- mov ecx,dword PTR [esi]
- push ecx
- fld dword PTR [esp] ; ST(0) = Z, ST(1) = Y, ST(2) = X
- add esp,4
- mov [eax],ecx ; Przepisanie trzeciej liczby z trójki do nowej tablicy
- sub esi,8
- sub eax,8
- ;Właściwa konwersja ;3.063*x - 1.393*y - 0.476*z
- ; ST(0) = Z, ST(1) = Y, ST(2) = X
- ;////////////////////////////////////////////////////////////////////
- mov ecx,3063
- push ecx
- fild dword PTR [esp] ; ST(0)= 3063, ST(1) = Z, ST(2) = Y, ST(3) = X
- mov ecx,1000
- push ecx
- fild dword PTR [esp] ; ST(0) = 1000, ST(1)= 3063, ST(2) = Z, ST(3) = Y, ST(4) = X
- add esp,8
- fdivp st(1),st(0) ; ST(0)= 3.063, ST(1) = Z, ST(2) = Y, ST(3) = X
- fmulp st(3),st(0) ; ST(0) = Z, ST(1) = Y, ST(2) = X*3,063
- ;////////////////////////////////////////////////////////////////////
- mov ecx,1393
- push ecx
- fild dword PTR [esp]
- mov ecx,1000
- push ecx
- fild dword PTR [esp] ; ST(0) = 1000, ST(1)= 1393, ST(2) = Z, ST(3) = Y, ST(4) = X*3,063
- add esp,8
- fdivp st(1),st(0) ; ST(0)= 1.393, ST(1) = Z, ST(2) = Y, ST(3) = X*3,063
- fmulp st(2),st(0) ; ST(0) = Z, ST(1) = Y*1.393, ST(2) = X*3,063
- ;////////////////////////////////////////////////////////////////////
- mov ecx,476
- push ecx
- fild dword PTR [esp]
- mov ecx,1000
- push ecx
- fild dword PTR [esp] ; ST(0) = 1000, ST(1)= 476, ST(2) = Z, ST(3) = *1.393, ST(4) = X*3,063
- add esp,8
- fdivp st(1),st(0) ; ST(0)= 0.476, ST(1) = Z, ST(2) = *1.393, ST(3) = X*3,063
- fmulp st(1),st(0) ; ST(0) = Z*0.476, ST(1) = Y*1.393, ST(2) = X*3,063
- ;////////////////////////////////////////////////////////////////////
- fsubp st(2),st(0) ; ST(0)= Y*1.393 ST(1) = ( X*3.063 - Z*0.476 )
- fsubp st(1),st(0); ST(0) = ( X*3.063 - Z*0.476 - Y*1.393 )
- ;Wynik mamy na wierzchołku koprocesora
- fstp dword PTR wynik
- mov ecx,dword PTR wynik
- mov [eax],ecx ; Zapisanie wyniku do pierwszgo floata z trójki
- add eax,12 ;Przesunięcie o kolejne 3 elementy
- add esi,12
- pop ecx ; Przywrócenie ecx, aby móc kontrolować pętle
- dec ecx
- jne poczatekPetli
- pop eax ; Wczytuje adres
- pop edi
- pop esi
- pop ebx
- pop ebp
- ret
- _XYZ2R ENDP
- END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement