Advertisement
Guest User

Untitled

a guest
Jan 18th, 2017
136
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.96 KB | None | 0 0
  1. //Tomasz Kontek 160553
  2. #include <stdio.h>
  3.  
  4. extern float* XYZ2R(float * tablCIEXYZ,int n);
  5.  
  6. int main() {
  7. float * wsk;
  8. float tab[12] = {
  9. 1.0, 2.0, 3.0,
  10. 1.5, 2.5, 3.5,
  11. 4.5, 2.5, 5.0,
  12. 0.5, 10.0, 0.75
  13. };
  14.  
  15. int rozmiar = sizeof(tab) / sizeof(tab[0]);
  16. for (int i = 0; i < (rozmiar/3); i++) {
  17. printf("%f ||| %f ||| %f \n", tab[ 3*i ],tab[3*i + 1],tab[3*i + 2]);
  18. }printf("\n\n");
  19. wsk = tab;
  20.  
  21. wsk = XYZ2R(wsk, (rozmiar / 3) );
  22.  
  23. for (int i = 0; i < (rozmiar / 3); i++) {
  24. printf("%f ||| %f ||| %f \n", wsk[3*i], wsk[3*i + 1], wsk[3*i + 2]);
  25. }printf("\n\n");
  26.  
  27. getchar();
  28. return 0;
  29. }
  30.  
  31. ///////////////////////////////////////////////////////////////////////
  32.  
  33. ; 1 - wskaźnik do liczby typu float będzie zwracany przez eax
  34. .686
  35. .model flat
  36.  
  37. public _XYZ2R
  38. extern _malloc :PROC
  39. .data
  40. wynik dd 0.0
  41. .code
  42.  
  43. _XYZ2R PROC
  44. push ebp
  45. mov ebp,esp
  46. push ebx
  47. push esi
  48. push edi
  49.  
  50. mov esi,[ebp +8] ; ESI = Adres tablicy
  51. mov eax,[ebp + 12] ; EAX = n /3 n to liczba elemntów tablicy
  52. mov edx,12 ; Aby wyliczyć liczbę bajtów które musi przyjąć _malloc
  53. ; muszę drugi parametr znajdujący się teraz w eax pomnożyć przez 3
  54. ; wtedy mam liczbę danych typu float w tablicy,
  55. ; i jeszczepomnożyć razy 4, ponieważ float ma 4 bajty
  56. mul edx ; EAX = liczba bajtów dla funkcji malloc
  57.  
  58. push edx
  59. call _malloc ; EAX = adres zarezerwowanej pamięci,czyli naszej nowej tablicy, już do końca programu go nie zmieniam
  60. add esp,4
  61.  
  62. mov ecx,[ebp+12] ; ECX = n /3
  63.  
  64.  
  65. push eax ; Zapiszę adres na później, ponieważ w pętli będę go zmieniał
  66.  
  67. poczatekPetli:
  68. finit ; Możliwe że nawet niepotrzebne w tym programie
  69. push ecx ;ECX pomocniczo
  70.  
  71. mov ecx,dword PTR [esi]
  72.  
  73. push ecx
  74. fld dword PTR [esp] ; ST(0)= X
  75. add esp,4
  76.  
  77. add esi,4
  78. add eax,4
  79. mov ecx,dword PTR [esi]
  80.  
  81. push ecx
  82. fld dword PTR [esp] ; ST(0) = Y, ST(1) = X
  83. add esp,4
  84.  
  85. mov [eax],ecx ; Przepisanie drugiej liczby z trójki do nowej tablicy
  86. add esi,4
  87. add eax,4
  88. mov ecx,dword PTR [esi]
  89.  
  90. push ecx
  91. fld dword PTR [esp] ; ST(0) = Z, ST(1) = Y, ST(2) = X
  92. add esp,4
  93.  
  94. mov [eax],ecx ; Przepisanie trzeciej liczby z trójki do nowej tablicy
  95. sub esi,8
  96. sub eax,8
  97.  
  98.  
  99. ;Właściwa konwersja ;3.063*x - 1.393*y - 0.476*z
  100. ; ST(0) = Z, ST(1) = Y, ST(2) = X
  101. ;////////////////////////////////////////////////////////////////////
  102. mov ecx,3063
  103. push ecx
  104. fild dword PTR [esp] ; ST(0)= 3063, ST(1) = Z, ST(2) = Y, ST(3) = X
  105. mov ecx,1000
  106. push ecx
  107. fild dword PTR [esp] ; ST(0) = 1000, ST(1)= 3063, ST(2) = Z, ST(3) = Y, ST(4) = X
  108. add esp,8
  109.  
  110. fdivp st(1),st(0) ; ST(0)= 3.063, ST(1) = Z, ST(2) = Y, ST(3) = X
  111. fmulp st(3),st(0) ; ST(0) = Z, ST(1) = Y, ST(2) = X*3,063
  112. ;////////////////////////////////////////////////////////////////////
  113. mov ecx,1393
  114. push ecx
  115. fild dword PTR [esp]
  116. mov ecx,1000
  117. push ecx
  118. fild dword PTR [esp] ; ST(0) = 1000, ST(1)= 1393, ST(2) = Z, ST(3) = Y, ST(4) = X*3,063
  119. add esp,8
  120.  
  121. fdivp st(1),st(0) ; ST(0)= 1.393, ST(1) = Z, ST(2) = Y, ST(3) = X*3,063
  122. fmulp st(2),st(0) ; ST(0) = Z, ST(1) = Y*1.393, ST(2) = X*3,063
  123. ;////////////////////////////////////////////////////////////////////
  124.  
  125. mov ecx,476
  126. push ecx
  127. fild dword PTR [esp]
  128. mov ecx,1000
  129. push ecx
  130. fild dword PTR [esp] ; ST(0) = 1000, ST(1)= 476, ST(2) = Z, ST(3) = *1.393, ST(4) = X*3,063
  131. add esp,8
  132.  
  133. fdivp st(1),st(0) ; ST(0)= 0.476, ST(1) = Z, ST(2) = *1.393, ST(3) = X*3,063
  134. fmulp st(1),st(0) ; ST(0) = Z*0.476, ST(1) = Y*1.393, ST(2) = X*3,063
  135. ;////////////////////////////////////////////////////////////////////
  136. fsubp st(2),st(0) ; ST(0)= Y*1.393 ST(1) = ( X*3.063 - Z*0.476 )
  137. fsubp st(1),st(0); ST(0) = ( X*3.063 - Z*0.476 - Y*1.393 )
  138. ;Wynik mamy na wierzchołku koprocesora
  139. fstp dword PTR wynik
  140. mov ecx,dword PTR wynik
  141. mov [eax],ecx ; Zapisanie wyniku do pierwszgo floata z trójki
  142.  
  143. add eax,12 ;Przesunięcie o kolejne 3 elementy
  144. add esi,12
  145. pop ecx ; Przywrócenie ecx, aby móc kontrolować pętle
  146. dec ecx
  147. jne poczatekPetli
  148.  
  149. pop eax ; Wczytuje adres
  150. pop edi
  151. pop esi
  152. pop ebx
  153. pop ebp
  154. ret
  155. _XYZ2R ENDP
  156. END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement