Trsak

Untitled

Jul 21st, 2020
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.89 KB | None | 0 0
  1. ;student: Petr Sopf
  2. ;login: xsopfp00
  3.  
  4. %include "rw32-2017.inc"
  5.  
  6. %macro WRITE_ARRAY 4
  7. push esi
  8. push ecx
  9. push eax
  10. mov esi,%1
  11. mov ecx,%2
  12. %%writeElement:
  13. lods%3
  14. call Write%4
  15. cmp ecx,1
  16. jbe %%skipComma
  17. mov al,','
  18. call WriteChar
  19. %%skipComma:
  20. loop %%writeElement
  21.  
  22. call WriteNewLine
  23. pop eax
  24. pop ecx
  25. pop esi
  26. %endmacro
  27.  
  28. %macro F13_CALL 3
  29. mov esi,%2
  30. mov ecx,%3
  31. call %1
  32. %endmacro
  33.  
  34. %macro F2_CALL 5
  35. push %5
  36. push %4
  37. push %3
  38. push %2
  39. call %1
  40. add esp,16
  41. %endmacro
  42.  
  43. section .data
  44. A1_1 dd 1245184,983040,1048576,393216,1048576
  45. A2_1 dd 1245184,983040,1048576,393216,1048576
  46. B2 dd 14420540,1800817106,2491283952,4231953432,2101597154
  47. A3_1 dw 1792,768,1024,-1536,1024
  48.  
  49. section .text
  50. ;
  51. ;--- �kol 1 ---
  52. ;
  53. ;Naprogramujte funkci "getMax", kter� v poli 32bitov�ch ��sel bez znam�nka nalezne maximum a vr�t� jeho hodnotu.
  54. ;
  55. ;unsigned int getMax(ESI, ECX)
  56. ; - vstup:
  57. ; - ESI: ukazatel na za��tek pole 32bitov�ch prvk� bez znam�nka
  58. ; - ECX: po�et prvk� pole (32bitov� hodnota bez znam�nka)
  59. ; - v�stup:
  60. ; - EAX: hodnota 32bitov�ho maxima bez znam�nka
  61. ; - funkce mus� zachovat obsah v�ech registr�, krom� registru EAX a p��znakov�ho registru
  62.  
  63. getMax:
  64. push ebx
  65. mov ebx, -1
  66.  
  67. loopArray:
  68. inc ebx
  69. cmp eax, [esi+4*ebx]
  70. jl isGreater
  71. jmp next
  72.  
  73. isGreater:
  74. mov eax, [esi+4*ebx]
  75.  
  76. next:
  77. cmp ebx, ecx
  78. jl loopArray
  79.  
  80. pop ebx
  81. ret
  82.  
  83. ;
  84. ;--- �kol 2 ---
  85. ;
  86. ;Naprogramujte funkci "addX", kter� k jednotliv�m prvk�m pole A p�i�te hodnotu x a jednotliv� v�sledky ulo�� do pole B.
  87. ;
  88. ;D�lka pol� je d�na parametrem N. Funkce mus� b�t naprogramov�na s vyu�it�m p�ed�v�n� parametr� na z�sobn�ku tak,
  89. ;�e parametry funkce se ukl�daj� na z�sobn�k od posledn�ho do prvn�ho (zprava doleva),
  90. ;parametry ze z�sobn�ku ukl�z� volaj�c� a v�sledek funkce se vrac� v registru EAX.
  91. ;
  92. ;int addX(unsigned int *pA, unsigned int N, unsigned int x, unsigned int *pB)
  93. ; - vstup:
  94. ; pA: ukazatel na pole A (pole A obsahuje 32bitov� hodnoty bez znam�nka)
  95. ; N: po�et prvk� pole A (32bitov� ��slo bez znam�nka)
  96. ; x: hodnota x (32bitov� ��slo bez znam�nka)
  97. ; pB: ukazatel na pole B (pole B bude obsahovat 32bitov� hodnoty bez znam�nka)
  98. ; - v�stup:
  99. ; - EAX = 0: v p��pad�, �e nenastala ��dn� chyba
  100. ; - EAX = -1: v p��pad�, �e je neplatn� ukazatel *pA (tj. pA == 0)
  101. ; - EAX = -2: v p��pad�, �e je neplatn� ukazatel *pB (tj. pB == 0)
  102. ; - funkce mus� zachovat obsah v�ech registr�, krom� registru EAX a p��znakov�ho registru
  103.  
  104. addX:
  105. push ebx
  106. push ecx
  107. push edx
  108.  
  109. mov ebp, esp
  110. sub esp, 4
  111.  
  112. mov eax, [ebp+16];A
  113. mov ecx, [ebp+20];N
  114. mov edx, [ebp+28];B
  115.  
  116. mov ebx, 0
  117. loopClear:
  118. mov [edx+ecx*4-4], ebx
  119.  
  120. loop loopClear
  121.  
  122. mov ebx, [ebp+24];x
  123. mov ecx, [ebp+20];N
  124.  
  125. cmp eax, 0
  126. je errorA
  127.  
  128. cmp edx, 0
  129. je errorB
  130.  
  131. loopall:
  132. add [edx+ecx*4-4], ebx
  133. mov ebx, [eax+ecx*4-4]
  134. add [edx+ecx*4-4], ebx
  135. mov ebx, [ebp+24]
  136. loop loopall
  137.  
  138. jmp end
  139.  
  140. errorA:
  141. mov eax, -1
  142. jmp end
  143.  
  144. errorB:
  145. mov eax, -2
  146. jmp end
  147.  
  148. end:
  149. mov esp, ebp
  150. pop edx
  151. pop ecx
  152. pop ebx
  153. ret
  154.  
  155. ;
  156. ;--- �kol 3 ---
  157. ;
  158. ;Naprogramujte funkci "sort", kter� vzestupn� (od nejmen��ho k nejv�t��mu) se�ad� pole 16bitov�ch prvk� se znam�nkem A.
  159. ;
  160. ;Uk�zka algoritmu �azen� v jazyce C:
  161. ;
  162. ;int *pA, i, j, N;
  163. ;for(i = 0; i < N; i++) {
  164. ; for(j = i + 1; j < N; j++) {
  165. ; if (pA[i] > pA[j]) { tmp = pA[i]; pA[i] = pA[j]; pA[j] = tmp; }
  166. ; }
  167. ; }
  168. ;
  169. ;void sort(short *pA, unsigned int N)
  170. ; - vstup:
  171. ; ESI: ukazatel na pole A (pole A obsahuje 16bitov� hodnoty se znam�nkem)
  172. ; ECX: po�et prvk� pole A (32bitov� ��slo bez znam�nka)
  173. ; - funkce mus� zachovat obsah v�ech registr�, krom� registru EAX a p��znakov�ho registru
  174.  
  175. sort:
  176. push eax
  177. push ebx
  178. push ecx
  179. push edx
  180.  
  181. sub ecx, 1
  182.  
  183. mov eax, 0 ; i=0
  184. firstFor:
  185. cmp eax, ecx
  186. jge done
  187.  
  188. mov ebx, eax ; j = i
  189. secondFor:
  190. inc ebx
  191. push ecx
  192. mov ecx, 0
  193. mov edx, 0
  194. mov dx, [esi+2*eax] ;pA[i]
  195. cmp dx, [esi+2*ebx]
  196. jg greater ;pA[i] > pA[j]
  197. jmp endSecond
  198.  
  199. greater:
  200. mov cx, dx ;tmp = pA[i]
  201. mov dx, [esi+2*ebx]
  202. mov [esi+2*eax], dx ;pA[i] = pA[j];
  203. mov [esi+2*ebx], cx
  204.  
  205. endSecond:
  206. pop ecx
  207. cmp ebx, ecx
  208. jl secondFor ;j < N
  209.  
  210. cmp eax, ecx
  211. jl incEax ;i < N
  212.  
  213. done:
  214. pop edx
  215. pop ecx
  216. pop ebx
  217. pop eax
  218. ret
  219.  
  220. incEax:
  221. inc eax
  222. jmp firstFor
  223.  
  224. main:
  225. mov ebp, esp; for correct debugging
  226. push ebp
  227. mov ebp,esp
  228.  
  229. WRITE_ARRAY A1_1, 5, d, UInt32
  230. F13_CALL getMax, A1_1, 5
  231. call WriteUInt32
  232. call WriteNewLine
  233.  
  234. WRITE_ARRAY A2_1, 5, d, UInt32
  235. WRITE_ARRAY B2, 5, d, UInt32
  236. F2_CALL addX, A2_1, 5, 4127762612, B2
  237. call WriteUInt32
  238. call WriteNewLine
  239. call WriteFlags
  240. WRITE_ARRAY A2_1, 5, d, UInt32
  241. WRITE_ARRAY B2, 5, d, UInt32
  242.  
  243. WRITE_ARRAY A3_1, 5, w, Int16
  244. F13_CALL sort, A3_1, 5
  245. call WriteInt16
  246. call WriteNewLine
  247. WRITE_ARRAY A3_1, 5, w, Int16
  248.  
  249. pop ebp
  250. ret
Add Comment
Please, Sign In to add comment