Advertisement
Guest User

Untitled

a guest
Jan 23rd, 2017
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.95 KB | None | 0 0
  1. %use altreg
  2. section .text ; program 64-bitowy
  3.  
  4. global drawInMemory
  5. extern printf
  6.  
  7. drawInMemory:
  8. push rbx
  9.  
  10. mov R8, RDI ;pPixelBuffer
  11. mov R9, RSI ;WIDTH
  12. sub R9, 1 ; --WIDTH ;na potrzeby petli
  13. mov R10, RDX ;HEIGHT
  14. sub R10, 1 ; --HEIGHT ;na potrzeby petli
  15. movq xmm9, xmm3 ;moveX
  16. movq xmm10, xmm4 ;moveY
  17. xor R11, R11 ; pozycja w buforze=0
  18.  
  19.  
  20.  
  21.  
  22.  
  23.  
  24.  
  25. mov R12, R9; set CounterX
  26. xloop:
  27.  
  28. mov R13, R10 ;set CounterY
  29. yloop:
  30. ;liczenie zx
  31.  
  32. pxor xmm4, xmm4 ;xmm4=0
  33. CVTSI2SD xmm4, r9 ; xmm4 = w
  34. pierwszy:
  35. addsd xmm4, [jeden]
  36. drugi:
  37. divsd xmm4, [dwa] ; xmm4 /=2 (w/2)
  38. trzeci:
  39. pxor xmm3, xmm3 ;xmm3=0
  40. cvtsi2sd xmm3, r12 ;xmm3=x
  41. subsd xmm3, xmm4 ; xmm3= x - w/2
  42. mulsd xmm3, [poltora] ; xmm3 = 1.5 * (x-w/2)
  43. pxor xmm4, xmm4 ; xmm4=0
  44. addsd xmm4, xmm2 ; xmm4=zoom
  45. divsd xmm4, [dwa]; xmm4 = 0.5*zoom
  46. pxor xmm5, xmm5 ; xmm5=0
  47. cvtsi2sd xmm5, rsi ; xmm5=w
  48. mulsd xmm4, xmm5 ; xmm4 = 0.5*zoom*w
  49. divsd xmm3, xmm4 ; zx = 1.5*(x-w/2)/(0.5*zoom*w)
  50. addsd xmm3, xmm9 ;zx +=moveX
  51. ;rejestry xmm4 i xmm5 juz niepotrzebne
  52. ;rejestr xmm3 nie do zmiany juz
  53.  
  54. ;liczenie zy
  55.  
  56. pxor xmm5, xmm5 ; xmm5=0
  57. cvtsi2sd xmm5, rdx ;xmm5=h
  58. divsd xmm5, [dwa] ; xmm5=h/2
  59.  
  60. pxor xmm4, xmm4 ;xmm4=0
  61. cvtsi2sd xmm4, r13 ;xmm4=y
  62. subsd xmm4, xmm5 ; xmm4 = y - h/2
  63.  
  64.  
  65. cvtsi2sd xmm5, rdx
  66. mulsd xmm5, xmm2
  67. divsd xmm5, [dwa]
  68. divsd xmm4, xmm5
  69. dodanie:
  70. addsd xmm4, xmm10 ;zy += moveY
  71. ;rejestr xmm5 juz niepotrzebny
  72. ;rejest xmm3 i xmm4 nie do zmiany
  73.  
  74.  
  75.  
  76. mov R14, 1000
  77. pxor xmm5, xmm5 ; xmm5=0
  78. addsd xmm5, xmm3 ;xmm5 = zx
  79. mulsd xmm5, xmm5 ;xmm5 = zx*zx
  80. pxor xmm6, xmm6 ; xmm6=0
  81. addsd xmm6, xmm4 ; xmm6= zy
  82. mulsd xmm6, xmm6 ; xmm6=zy*zy
  83. addsd xmm5, xmm6
  84.  
  85. comisd xmm5, [cztery]
  86. jnb koniec_iteracji
  87.  
  88. beginLoop:
  89.  
  90. pxor xmm5, xmm5 ;
  91. addsd xmm5, xmm3
  92. mulsd xmm5, xmm5
  93. pxor xmm6, xmm6
  94. addsd xmm6, xmm4
  95. mulsd xmm6, xmm6
  96. subsd xmm5, xmm6
  97. addsd xmm5, xmm0
  98. ;xmm6 niepotrzebny juz
  99. mulsd xmm4, xmm3 ; zy=zy*zx
  100. mulsd xmm4, [dwa] ; zy=2*zy*zy
  101. addsd xmm4, xmm1 ;= zy=2*zy*zy+Cy
  102.  
  103. pxor xmm3, xmm3 ; zx=0
  104. addsd xmm3, xmm5 ; zx=tmp
  105. ;xmm5 juz niepotrzebny
  106.  
  107. ;sprawdzam czy wskoczyc znowu do petli czy nie
  108. pxor xmm5, xmm5 ; xmm5=0
  109. addsd xmm5, xmm3 ;xmm5 = zx
  110. mulsd xmm5, xmm5 ;xmm5 = zx*zx
  111. pxor xmm6, xmm6 ; xmm6=0
  112. addsd xmm6, xmm4 ; xmm6= zy
  113. mulsd xmm6, xmm6 ; xmm6=zy*zy
  114. addsd xmm5, xmm6 ; xmm5=zx*zx+zy*zy
  115. dec R14 ;decrementing loop counter
  116. comisd xmm5, [cztery] ; zx * zx + zy * zy >= 4
  117. jnb koniec_iteracji
  118. cmp R14, 0
  119. jnz beginLoop ; i!=0
  120. koniec_iteracji:
  121. ;licze kolory
  122. ; (R,G,B) = (iteracja%256, 255, 0); /* 0x01FF to 0x3FFF */
  123. xor r15, r15 ; r15=0
  124.  
  125. add r15, 1000 ; MAX ITERACJI
  126. cvtsi2sd xmm7, r15 ;MAX ITERACJI DOUBLE
  127. sub r15, r14 ; MAX ITERACJI - licznik iteracji = ile zostalo wykonanych iteracji na pikselu
  128. cvtsi2sd xmm8, r15 ; ile wykonano iteracji na pikselu
  129. cmp r15, 0 ;pomijam obliczanie koloru dla zerowej ilosci wykonanych iteracji
  130. jz zero_iteracji
  131. divsd xmm8, xmm7 ; (0,1] ile procent wykonano iteracji
  132. mov r15, 255
  133. cvtsi2sd xmm7, r15 ; 255 double
  134. mulsd xmm8, xmm7 ; procent * 255, odcien
  135. roundsd xmm8, xmm8, 9 ;zaokraglenie
  136. cvttsd2si r15, xmm8 ;jaki odcien
  137.  
  138.  
  139. zapis:
  140. mov BYTE [R8+R11], r15l ; R=255
  141. inc R11
  142. mov BYTE [R8+R11], r15l ; G=al
  143. inc R11
  144. mov BYTE [R8+R11], 0 ; B=255
  145. inc R11
  146. powrot:
  147. dec R13
  148. jns yloop
  149.  
  150. endyloop:
  151. ;end yloop
  152.  
  153. dec R12
  154. jns xloop
  155. ;end xloop
  156.  
  157.  
  158.  
  159.  
  160.  
  161.  
  162.  
  163. end:
  164.  
  165.  
  166.  
  167. pop rbx
  168. ret
  169.  
  170. zero_iteracji:
  171. mov BYTE [R8+R11], 255 ; R=255
  172. inc R11
  173. mov BYTE [R8+R11], 255 ; G=al
  174. inc R11
  175. mov BYTE [R8+R11], 255 ; B=255
  176. inc R11
  177.  
  178. jmp powrot
  179. jeden:
  180. dq 1.0e0
  181. poltora:
  182. dq 1.5e0
  183. dwa:
  184. dq 2.0e0
  185. pol:
  186. dq 0.5e0
  187. cztery:
  188. dq 4.0e0
  189. szescdziesiatdwa:
  190. db 62
  191. dwapiecpiec:
  192. db 255
  193.  
  194.  
  195.  
  196.  
  197. #ifndef X86_FUNCTION_H_
  198. #define X86_FUNCTION_H_
  199.  
  200. void drawInMemory(unsigned char *pPixelBuffer, int width, int height, double C_real, double C_imaginary, double zoom, double moveX, double moveY);
  201.  
  202. #endif // X86_FUNCTION_H_
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement