Guest User

Untitled

a guest
Jan 21st, 2018
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.52 KB | None | 0 0
  1. extern __imp__wsprintfA
  2. extern __imp__MessageBoxA@16
  3. extern __imp__ExitProcess@4
  4. extern __imp__malloc
  5. extern __imp__free
  6.  
  7. %define MessageBox [__imp__MessageBoxA@16]
  8. %define wsprintf [__imp__wsprintfA]
  9. %define malloc [__imp__malloc]
  10. %define free [__imp__free]
  11.  
  12. %macro getMem 1
  13. push %1
  14. call malloc
  15. add esp, 4
  16. %endmacro
  17.  
  18. %macro freeMem 1
  19. push %1
  20. call free
  21. add esp, 4
  22. %endmacro
  23.  
  24. MB_ICONINFORMATION equ 40h
  25. section .data
  26. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  27. ;; debug
  28. doutput db "number",0
  29. debugs db "%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d",0
  30. mb_title db "stack",0
  31.  
  32. .code
  33. global _main
  34.  
  35. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  36. ;;; вектор
  37. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  38.  
  39. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  40. ;; кладет в esi адрес выделенной памяти
  41. ;;портит ebx, eax
  42. vectorInit:
  43. mov ebx,8 ;размер вектора
  44. shl ebx,2
  45. add ebx,8
  46. push ebx
  47. getMem ebx
  48. pop ebx
  49. mov esi,eax
  50. mov dword[esi],0
  51. mov dword[esi+4],8
  52. sub ebx,4
  53. shr ebx,2
  54. ret
  55.  
  56. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  57. ;;принимает значение и добавляет его в конец
  58. ;;портит eax, ebx, ecx, edx
  59. vectorAdd:
  60. mov eax,dword[esp+4]
  61. mov ebx,dword[esi+4]
  62.  
  63. CondVectFull:
  64. cmp ebx,dword[esi]
  65. je vectIsFull
  66. jg vectIsNotFull
  67. vectIsFull:
  68.  
  69. shl ebx,3
  70. add ebx,8
  71. getMem ebx
  72. mov ebx,dword[esi]
  73. inc ebx ;копируем колво занятых
  74. mov dword[eax],ebx
  75. mov ebx,dword[esi+4]
  76. shl ebx,1 ;копируем новый размер
  77. mov dword[eax+4],ebx
  78.  
  79. mov ebx,dword[esi]
  80. add ebx,2
  81. mov ecx,1
  82. mov ebp,ebx
  83. copyVectorAdd:
  84. inc ecx
  85. cmp ebx,ecx
  86. jl endCopyVectorAdd
  87. mov edx,dword[esi+4*ecx]
  88. mov dword[eax+4*ecx],edx
  89. jmp copyVectorAdd
  90. endCopyVectorAdd
  91. mov ebx,dword[eax]
  92. mov ecx,dword[esp+4]
  93. mov dword[eax+4*ebx+4],ecx
  94. push eax
  95. freeMem esi
  96. pop esi
  97. jmp exitVectorAdd
  98. vectIsNotFull:
  99. mov ebx,9
  100. mov eax,dword[esi]
  101. inc eax
  102. mov dword[esi],eax
  103. mov ebx,dword[esp+4]
  104. dec eax
  105. mov dword[esi+4*eax+8],ebx
  106. exitVectorAdd:
  107. ret
  108.  
  109. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  110. ;; возвращает в eax значение последнего элемента
  111. ;;портит ebx, eсx, edx
  112. vectorPop:
  113. mov ebx,dword[esp+4]
  114. cmp ebx,0
  115. jl exitVectorPop
  116. cmp ebx,dword[esi]
  117. jge exitVectorPop
  118. mov eax,dword[esi+4]
  119. dec eax
  120. cmp eax,ebx
  121. jne moveVectPartLeft
  122. mov eax,dword[esi+4*ebx+8]
  123. mov ebx,dword[esi]
  124. sub ebx,4
  125. mov dword[esi],ebx
  126. jmp exitVectorPop
  127.  
  128. mov ecx,dword[esi]
  129. moveVectPartLeft:
  130. cmp ebx,ecx
  131. jl endMoveVectPartLeft
  132. mov eax,dword[esi+4*ebx+8]
  133. mov ecx,dword[esi+4*ebx+12]
  134. mov dword[esi+4*ebx+8],ecx
  135. mov dword[esi+4*ebx+12],eax
  136. inc ebx
  137. jmp moveVectPartLeft
  138. endMoveVectPartLeft:
  139. mov ebx,dword[esi]
  140. dec ebx
  141. mov dword[esi],ebx
  142. ;;;
  143. mov ecx,dword[esi+4]
  144. cmp ecx,9
  145. jle exitVectorPop
  146. ;;;
  147. shr ecx,2
  148. cmp ebx,ecx
  149. jge exitVectorPop
  150.  
  151.  
  152. mov ebx,dword[esi+4]
  153. add ebx,8
  154. getMem ebx
  155. mov ebx,dword[esi]
  156. dec ebx ;копируем колво занятых
  157. mov dword[eax],ebx
  158. mov ebx,dword[esi+4]
  159. shr ebx,2 ;копируем новый размер
  160. mov dword[eax+4],ebx
  161.  
  162. mov ebx,dword[esi]
  163. add ebx,2
  164. mov ecx,1
  165. mov ebp,ebx
  166. copyVectorPop:
  167. inc ecx
  168. cmp ebx,ecx
  169. jl endCopyVectorPop
  170. mov edx,dword[esi+4*ecx]
  171. mov dword[eax+4*ecx],edx
  172. jmp copyVectorPop
  173. endCopyVectorPop
  174. mov ebx,dword[eax]
  175. mov ecx,dword[esp+4]
  176. mov dword[eax+4*ebx+4],ecx
  177. push eax
  178. freeMem esi
  179. pop esi
  180. jmp exitVectorPop
  181. exitVectorPop:
  182. ret
  183.  
  184. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  185. ;; принемает индекс, с которого ищет
  186. ;; возвращает знач индекс макс элемента в eax
  187. ;; портит ebx, ecx
  188. vectorGetMaxIndex:
  189. mov ecx,dword[esp+4] ;ecx - counter
  190. call vectorIsEmpty
  191. cmp eax,1
  192. je vectorGetMaxIndexExit
  193. cmp ecx,dword[esi]
  194. jge vectorGetMaxIndexExit
  195. cmp ecx,0
  196. jl vectorGetMaxIndexExit
  197. push ecx ;текущий макс
  198. dec ecx
  199. vectorGetMaxIndexCycle:
  200. inc ecx
  201. cmp ecx,dword[esi]
  202. je vectorGetMaxIndexCycleEnd
  203. pop ebx
  204. push ebx
  205. mov eax,dword[esi+4*ebx+8]
  206. mov ebx,[esi+4*ecx+8]
  207. cmp ebx,eax
  208. jle vectorGetMaxIndexCycle
  209. pop eax
  210. push ecx
  211. jmp vectorGetMaxIndexCycle
  212. vectorGetMaxIndexCycleEnd:
  213. pop eax
  214. vectorGetMaxIndexExit:
  215. ret
  216.  
  217. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  218. ;; принемает индекс, с которого ищет
  219. ;; возвращает знач индекс мин элемента в eax
  220. ;; портит ebx, ecx
  221. vectorGetMinIndex:
  222. mov ecx,dword[esp+4] ;ecx - counter
  223. call vectorIsEmpty
  224. cmp eax,1
  225. je vectorGetMinIndexExit
  226. cmp ecx,dword[esi]
  227. jge vectorGetMinIndexExit
  228. cmp ecx,0
  229. jl vectorGetMinIndexExit
  230. push ecx ;текущий мин
  231. dec ecx
  232. vectorGetMinIndexCycle:
  233. inc ecx
  234. cmp ecx,dword[esi]
  235. je vectorGetMinIndexCycleEnd
  236. pop ebx
  237. push ebx
  238. mov eax,dword[esi+4*ebx+8]
  239. mov ebx,[esi+4*ecx+8]
  240. cmp ebx,eax
  241. jge vectorGetMinIndexCycle
  242. pop ebx
  243. push ecx
  244. jmp vectorGetMinIndexCycle
  245. vectorGetMinIndexCycleEnd:
  246. pop ebx
  247. ; mov eax,ebx
  248. vectorGetMinIndexExit:
  249. ret
  250.  
  251. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  252. ;; принимает значение а и индекс i, приравневает iый эл к a
  253. ;; портит ebx
  254. vectorSort:
  255. call vectorIsEmpty
  256. cmp eax,1
  257. je vectorSortExit
  258. mov edx, 0 ;edx - counter внешнего цикла
  259. mov eax,dword[esi]
  260. cmp eax,1
  261. je vectorSortExit
  262. dec edx
  263. vectorSortCycle:
  264. inc edx
  265. ; mov eax,dword[esi]
  266. ; dec eax
  267. cmp edx,2;eax ; == n ?
  268. je vectorSortExit
  269. push edx
  270. call vectorGetMinIndex
  271. pop edx
  272. ;;swap нач
  273. mov ebx, dword[esi+4*eax+8]
  274. mov ecx, dword[esi+4*edx+8]
  275. mov dword[esi+4*edx+8],ebx
  276. mov dword[esi+4*eax+8],ecx
  277. ;;swap кон
  278. jmp vectorSortCycle
  279. vectorSortExit:
  280. ret
  281.  
  282. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  283. ;; принимает индекс i, возвращает в eax индекс iого элемента
  284. vectorGet:
  285. mov eax,dword[esp+4] ;;where
  286. cmp eax,0
  287. jl exitVectorGet
  288. cmp eax,dword[esi]
  289. jge exitVectorGet
  290. mov eax, dword[esi+4*eax+8]
  291. exitVectorGet:
  292. ret
  293.  
  294. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  295. ;; возвращает 0 или 1 в eax если vector пуст или не пуст соотв.
  296. vectorIsEmpty:
  297. mov eax,dword[esi]
  298. cmp eax,0
  299. je vectorIsEmptyTrue
  300. mov eax,0
  301. jmp exitFromVectorIsEmpty
  302. vectorIsEmptyTrue:
  303. mov eax,1
  304. exitFromVectorIsEmpty:
  305. ret
  306.  
  307. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  308.  
  309. vectorClear:
  310. freeMem esi
  311. call vectorInit
  312. ret
  313.  
  314. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  315. ;; возвращает первый элемент в eax
  316. vectorFirst:
  317. call vectorIsEmpty
  318. cmp eax,1
  319. je exitVectorFirst
  320. mov eax, dword[esi+8]
  321. exitVectorFirst:
  322. ret
  323.  
  324. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  325. ;; возвращает последний элемент в eax
  326. vectorLast:
  327. call vectorIsEmpty
  328. cmp eax,1
  329. je exitVectorLast
  330. mov eax,dword[esi]
  331. mov eax,dword[esi+4*eax+4] ;;+8-4
  332. exitVectorLast:
  333. ret
  334.  
  335. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  336.  
  337. vectorDestructor:
  338. freeMem esi
  339. ret
  340.  
  341. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  342. ;; итератор по вектору.
  343. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  344.  
  345. vectorIteratorInit:
  346. getMem 8
  347. mov dword[eax],0
  348. mov dword[eax+4],1
  349. ret
  350.  
  351. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  352.  
  353. vectorIteratorHasNext:
  354. mov eax,dword[esp+4]
  355. mov eax,dword[eax+4]
  356. mov ebx,dword[esi]
  357. cmp eax,ebx
  358. jg vectorIteratorHasNextFalse
  359. mov eax,1
  360. jmp vectorIteratorHasNextExit
  361. vectorIteratorHasNextFalse:
  362. mov eax,0
  363. vectorIteratorHasNextExit:
  364. ret
  365.  
  366. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  367.  
  368. vectorIteratorNext:
  369. mov eax,dword[esp+4]
  370. push eax
  371. call vectorIteratorHasNext
  372. pop ebx
  373. cmp eax,0
  374. je vectorIteratorNextExit
  375. mov eax,dword[esp+4]
  376. mov ebx,dword[eax+4]
  377. mov dword[eax],ebx
  378. inc ebx
  379. mov dword[eax+4],ebx
  380. mov eax,dword[esi+4*ebx]
  381. vectorIteratorNextExit:
  382. ret
  383.  
  384. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  385.  
  386. vectorIteratorHasPrev:
  387. mov eax,dword[esp+4]
  388. mov eax,dword[eax]
  389. cmp eax,0
  390. jle vectorIteratorHasPrevFalse
  391. mov eax,1
  392. jmp vectorIteratorHasPrevExit
  393. vectorIteratorHasPrevFalse:
  394. mov eax,0
  395. vectorIteratorHasPrevExit:
  396. ret
  397.  
  398. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  399.  
  400. vectorIteratorPrev:
  401. mov eax,dword[esp+4]
  402. push eax
  403. call vectorIteratorHasPrev
  404. pop ebx
  405. cmp eax,0
  406. je vectorIteratorPrevExit
  407. mov eax,dword[esp+4]
  408. mov ebx,dword[eax]
  409. mov dword[eax+4],ebx
  410. dec ebx
  411. mov dword[eax],ebx
  412. mov eax,dword[esi+4*ebx+8]
  413. vectorIteratorPrevExit:
  414. ret
  415.  
  416. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  417.  
  418. vectorIteratorDestructor:
  419. mov eax,dword[esp+4]
  420. freeMem eax
  421. ret
  422.  
  423. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  424.  
  425. _main:
  426.  
  427. jmp begin
  428.  
  429. begin:
  430. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  431. ;; инициализируем стек нулями, чтобы выводить даже если меньше параметров на стеке
  432. push 0
  433. push 0
  434. push 0
  435. push 0
  436. push 0
  437. push 0
  438. push 0
  439. push 0
  440. push 0
  441. push 0
  442. push 0
  443. push 0
  444. push 0
  445. push 0
  446. push 0
  447. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  448.  
  449. call vectorInit
  450. call vectorIteratorInit
  451.  
  452. push 9
  453. call vectorAdd
  454. pop ebx
  455. push 2
  456. call vectorAdd
  457. pop ebx
  458. push 6
  459. call vectorAdd
  460. pop ebx
  461. push 4
  462. call vectorAdd
  463. pop ebx
  464. push 2
  465. call vectorAdd
  466. pop ebx
  467. push 7
  468. call vectorAdd
  469. pop ebx
  470. push 2
  471. call vectorAdd
  472. pop ebx
  473. push 3
  474. call vectorAdd
  475. pop ebx
  476. push 2
  477. call vectorAdd
  478. pop ebx
  479. push 6
  480. call vectorAdd
  481. pop ebx
  482.  
  483. push 7
  484. call vectorGetMinIndex
  485. pop ecx
  486. push ebx
  487.  
  488. call vectorDestructor
  489. call vectorIteratorDestructor
  490.  
  491. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  492. ;; выведем содержимое последних 15 символов на стеке
  493. push debugs
  494. push doutput
  495. call wsprintf
  496. push MB_ICONINFORMATION
  497. push mb_title
  498. push doutput
  499. push 0
  500. call MessageBox
  501.  
  502. push 0
  503. call [__imp__ExitProcess@4]
  504. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  505.  
  506. ret ; завершение программы
  507. end
Add Comment
Please, Sign In to add comment