Advertisement
Guest User

Untitled

a guest
Feb 19th, 2019
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ;Autor: Robert Warwas
  2. ;nasm
  3.  
  4. [bits 32]
  5.  
  6. extern _printf
  7. extern _scanf
  8. extern _puts
  9. extern _exit
  10.  
  11. segment .data
  12.  
  13. formatI: db "%i", 0
  14. formatD: db "%d",0xa, 0
  15. formatNL: db 0xa, 0
  16.  
  17. formatHello: db "Hello", 0
  18.  
  19. segment .text
  20.  
  21. start:
  22. mov ebp,esp
  23.  
  24. ; rezerwujemy pamięć na 3 elementy
  25. sub esp, 40
  26. lea eax, [ebp - 40] ;liczymy adres pierwszego elementu tablicy
  27.  
  28. push eax ;wrzucamy adres poczatku tablicy 2 razy ponieważ jeden adres będzie słu         ;żył do indeksowania elementów a jeden do przywrócenia indeksu na początek tablicy
  29. push eax
  30.  
  31. ;[ptr A][ptr A][A][B][C][...][EBP]
  32.  
  33. mov ecx, 10
  34.  
  35. ;;;;;;;;;;;;wczytujemy dane do 3 elementów tablicy;;;;;;;;;;;;;;;
  36. wczytaj:
  37.  
  38. push ecx
  39. mov eax, [ebp - 44] ; w elemencie A powinna się znalezc wartosc 4
  40. push eax
  41. push formatI
  42. call _scanf
  43. add esp, 8
  44. pop ecx
  45. add [ebp - 44], dword 4
  46.  
  47. loop wczytaj
  48. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  49.  
  50. ;cofamy na początek indeks tablicy
  51. mov eax, [ebp - 48]
  52. mov [ebp - 44], eax
  53.  
  54. push dword 10
  55. push dword [ebp - 44]
  56. call sort
  57. add esp , 8
  58.  
  59. push formatNL
  60. call _puts
  61. add esp,4
  62.  
  63. mov ecx, 10
  64. ;;;;;;;;wypisuje elementy tablicy;;;;;;;;;;;;;
  65. wypisz:
  66.  
  67. push ecx
  68. mov eax, [ebp - 44]
  69. push dword [eax]
  70. push formatD
  71. call _printf
  72. add esp, 8
  73. pop ecx
  74. add [ebp - 44], dword 4
  75.  
  76. loop wypisz
  77. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  78.  
  79. push formatI
  80. call _scanf
  81. add esp, 4
  82.  
  83. push dword 0
  84. call _exit
  85.  
  86. ; void sort(int * tab, int n) 1-->adres tablicy 2-->liczba elementów
  87. sort:
  88. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  89.  
  90. push ebp
  91. mov ebp, esp
  92.  
  93. sub esp, 4 ;rezeruwjemy miejsce dla wskaźnika indeksującego --> [ebp - 4]
  94. sub esp, 8; rezerujwmy miejsce dla 2 elementow ktore beda porownywane
  95. ; pierwszy element porownywany -->[ebp - 12]  
  96. ; drugi element porownywany --> [ebp - 8]
  97.  
  98. sub esp ,4 ; zmienna okreslajaca czy w danym obiegu petli wystapila jakas zamiana ele            ;tow --> [ebp - 16]
  99.  
  100. ; inicjalizujemy indekser tablicy adresem jej początku
  101. mov eax, [ebp + 8]
  102. mov [ebp - 4], eax
  103.  
  104.  
  105. ;[ebp + 8] --> adres poczatku tablicy
  106. ;[ebp + 12] --> liczba elementow
  107.  
  108. ; petla iterująca po wszystkich elementach wykona się n-1
  109. ; gdyz jesli iterowala by przez wszystkie indeksy tablicy
  110. ; odbylo by sie porownanie ze old_ebp
  111.  
  112.  
  113.  
  114. petla_spr:
  115.  
  116. mov eax, [ebp + 12]
  117. sub eax, 1
  118. mov ecx, eax
  119.  
  120. mov [ebp - 16], dword 0
  121.  
  122. petla_n_element:
  123.  
  124. ;;;;;;;;inicjalizujemy pierwszy element porownywany wartościa wskaźnika indeksu;;
  125. mov eax, [ebp - 4]
  126. mov ebx, [eax]
  127. mov [ebp - 12], ebx
  128.  
  129. ;;;;;;;;inicjalizujemy drugi element porownywany wartościa wskaźnika indeksu;;
  130. mov eax, [ebp - 4 ]
  131. add eax, 4
  132. mov ebx, [eax]
  133. mov [ebp - 8], ebx
  134.  
  135. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  136.  
  137. ;teraz musimy porownac [ebp - 12] > [ebp - 8]
  138. mov eax, [ebp - 12]
  139. cmp eax, dword [ebp - 8]
  140. jg swap
  141. jmp skip_swap
  142. swap:
  143.  
  144. mov [ebp - 16], dword 1
  145.  
  146. ;teraz kopiujemy 2 element do pierwszego
  147. mov eax, [ebp - 8]
  148. mov ebx, [ebp - 4]
  149. mov [ebx], eax
  150.  
  151. ;teraz kopiujemy 1 element do drugiego
  152. mov eax, [ebp - 4]
  153. add eax, 4
  154. mov ebx, [ebp - 12]
  155. mov [eax], ebx
  156.  
  157. skip_swap:
  158.  
  159. add [ebp - 4], dword 4 ;skaczemy na następny element
  160.  
  161. loop petla_n_element
  162.  
  163. mov eax, [ebp + 8]
  164. mov [ebp - 4], eax
  165.  
  166. mov eax, [ebp -16]
  167. cmp eax, 0
  168.  
  169. loopnz petla_spr
  170.  
  171. leave
  172. ret
  173.  
  174. ;int mediana(int *tab, int n) zwraca mediane podanej tablicy w eax
  175. mediana:
  176.  
  177. push ebp
  178. mov ebp, esp
  179.  
  180. lea eax, [ebp + 8]
  181. push eax
  182. ;[ebp - 4] -->indekser tablicy
  183.  
  184. mov eax, [ebp + 12]
  185. mov ebx, 2
  186. div ebx
  187.  
  188. cmp edi,0
  189. jz parzysta;jeśli parzysta
  190. jmp nieparzysta
  191.  
  192. parzysta:
  193. mov ecx, eax
  194. mov eax, [ebp - 4]
  195.  
  196. sub eax, 4
  197. add eax, ecx
  198. ;[eax] -->adres elementu najbardziej z lewej potrzebnego do wyliczenia
  199.           ;mediany
  200.  
  201. mov ebx, eax
  202. add ebx,4
  203. ;[ebx] -->adres elementu najbardziej z prawej potrzebnego do wyliczenia
  204.           ;mediany
  205.  
  206. ;push eax
  207. ;push ebx
  208.  
  209. mov eax, [eax]
  210. mov ebx, [ebx]
  211.  
  212. sub ebx, eax ;liczymy różnice tyche elementow
  213.  
  214. push eax
  215. ;push eax
  216. mov eax, ebx
  217. mov esi,2
  218. div esi
  219.  
  220. pop ebx ; [ebx] --> wartość elelemtnu najbardzierj z lewej
  221. ;add ebx, dq eax
  222. mov eax, ebx ;kopiujemy do rejestru wynikowego
  223.  
  224. jmp skip_nieparzysta
  225.  
  226. nieparzysta:
  227.  
  228. skip_nieparzysta:
  229.  
  230. leave
  231. ret
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement