Advertisement
Guest User

Untitled

a guest
Dec 3rd, 2019
118
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.08 KB | None | 0 0
  1. section .text
  2.  
  3. global _print
  4.  
  5. _print:
  6. push ebx
  7. push ebp
  8. push edi
  9. push esi
  10.  
  11.  
  12. mov eax, [esp+28]
  13. mov esi, esp
  14.  
  15. mov ebx, 32
  16.  
  17. ;Читаю знак и сохраняю его в cl
  18.  
  19. xor ecx, ecx
  20. xor edx, edx
  21.  
  22. mov dl, [eax]
  23. cmp dl, '-'
  24. jne loop1
  25. mov cl, 1
  26. inc eax
  27. ;Записываю двоичную версию числа на стек
  28.  
  29. loop1:
  30. xor edx, edx
  31. ;Читаем первый символ worda
  32. mov ch, [eax + ebx - 2]
  33. call symbolFromCH
  34. ;Читаем второй символ worda
  35. mov ch, [eax + ebx - 1]
  36. call symbolFromCH
  37. sub esp, 1
  38. mov [esp], dh
  39. sub ebx, 2
  40. jnz loop1
  41.  
  42. cmp cl, 1
  43. jne n7
  44. call dop2
  45. n7:
  46.  
  47. xor eax, eax
  48. mov al, BYTE [esp]
  49. shr al, 7
  50. cmp al, 1
  51. jne n8
  52. call dop2
  53. n8:
  54. mov edi, esp
  55. push eax ;Сохраняем будущий знак на стек 1(-), 0(+)
  56.  
  57. ;Перевожу в десятичную и записываю в обратном порядке
  58. mov ebp, esp
  59. add ebp, 20
  60.  
  61.  
  62. loop4:
  63. mov edx, ebp
  64. sub edx, 16
  65. call div10
  66. mov eax, edx
  67. mov edx, ebp
  68. sub edx, 16
  69. call is0
  70. push eax
  71. cmp edx, 0
  72. jne loop4
  73.  
  74.  
  75. xor eax, eax
  76. xor ebx, ebx
  77. xor ecx, ecx
  78. xor edx, edx
  79.  
  80.  
  81. mov ebx, [esi+24]
  82. loop6:
  83. mov cl, [ebx]
  84. cmp cl, 0
  85. je endloop6
  86. inc ebx
  87. cmp cl, '%'
  88. je loop6
  89. cmp cl, 'i'
  90. je loop6
  91. cmp cl, '-'
  92. jne n9
  93. mov dh, 1
  94. jmp loop6
  95. n9:
  96. cmp cl, '0'
  97. jne n10
  98. cmp ch, 1
  99. je n11
  100. cmp eax, 0
  101. jne n11
  102. cmp dh, 1
  103. je loop6
  104. mov dh, 2
  105. mov ch, 1
  106. jmp loop6
  107. n10:
  108. cmp cl, '+'
  109. jne n11
  110. mov dl, 1
  111. jmp loop6
  112. n11:
  113. push ecx
  114. push edx
  115. mov ecx, 10
  116. mul ecx
  117. pop edx
  118. pop ecx
  119. push ecx
  120. mov ch, 0
  121. sub ecx, '0'
  122. add eax, ecx
  123. pop ecx
  124. jmp loop6
  125. endloop6:
  126.  
  127. sub edi, 4
  128.  
  129. mov ebx, [esi+20]
  130. mov esi, 0
  131. mov ecx, edi
  132. sub ecx, esp
  133. shr ecx, 2
  134. push ebx
  135. mov ebx, [edi]
  136. cmp dl, 1
  137. jne n13
  138. inc ecx
  139. mov esi, 1
  140. mov dl, '-'
  141. cmp ebx, 0
  142. jne n18
  143. mov dl, '+'
  144. n18:
  145. jmp n19
  146.  
  147. n13:
  148. cmp ebx, 1
  149. jne n19
  150. inc ecx
  151. mov esi, 1
  152. mov dl, '-'
  153.  
  154. n19:
  155. pop ebx
  156. cmp eax, ecx
  157. ja n14
  158. mov eax, ecx
  159. n14:
  160. mov ecx, eax
  161. push edx
  162. mov dl, ' '
  163. call myFill
  164. mov dl, 0
  165. mov [ebx], dl
  166. pop edx
  167. sub ebx, eax
  168.  
  169. mov ecx, edi
  170. sub ecx, esp
  171. shr ecx, 2
  172. add ecx, esi
  173.  
  174. cmp dh, 0
  175. jne n15
  176. push eax
  177. sub eax, ecx
  178. add ebx, eax
  179. pop eax
  180. call printSign
  181. call printNum
  182. n15:
  183. cmp dh, 1
  184. jne n17
  185. call printSign
  186. call printNum
  187. n17:
  188. cmp dh, 2
  189. jne n16
  190. call printSign
  191. mov ecx, edi
  192. sub ecx, esp
  193. shr ecx, 2
  194. add ecx, esi
  195. push eax
  196. sub eax, ecx
  197. push edx
  198. mov dl, '0'
  199. mov ecx, eax
  200. call myFill
  201. pop edx
  202. pop eax
  203. call printNum
  204. n16:
  205. ;Чистим стек
  206. mov esp, ebp
  207.  
  208.  
  209. pop esi
  210. pop edi
  211. pop ebp
  212. pop ebx
  213. ret
  214.  
  215.  
  216. ;Делит число на стэке (16 байта) на 10, остаток сохнаняет в edx.(портит регистр edx)
  217. div10:
  218. push ecx
  219. push ebx
  220. push eax
  221. mov ecx, edx
  222. xor edx, edx
  223. mov ebx, 0
  224. xor eax, eax
  225. loop2:
  226. mov eax, DWORD [ecx+ebx*4]
  227. bswap eax
  228. push ecx
  229. mov ecx, 10
  230. div ecx
  231. pop ecx
  232. bswap eax
  233. mov [ecx+ebx*4], eax
  234. inc ebx
  235. cmp ebx, 4
  236. jne loop2
  237. pop eax
  238. pop ebx
  239. pop ecx
  240. ret
  241.  
  242. ;Проверяет число на стэке (16 байта) на равность 0, записывает в edx 1, если выполнено(портит регистр edx)
  243. is0:
  244. push eax
  245. push ebx
  246. push ecx
  247.  
  248. mov ecx, 4
  249. mov ebx, 0
  250. loop3:
  251. dec ecx
  252. mov eax, DWORD [edx+ecx*4]
  253. cmp eax, 0
  254. je n5
  255. mov ebx, 1
  256. jmp endloop3
  257. n5:
  258. cmp ecx, 0
  259. jne loop3
  260. endloop3:
  261. mov edx, ebx
  262. pop ecx
  263. pop ebx
  264. pop eax
  265. ret
  266.  
  267. ;Приментяет к числу на стеке (16 байта от esp) дополнение до двух.
  268. dop2:
  269. push eax
  270. push ebx
  271. push ecx
  272. push edx
  273.  
  274. mov ebx, 4
  275. mov ecx, 1
  276. loop5:
  277. dec ebx
  278. mov eax, [esp + ebx*4 + 20]
  279. bswap eax
  280. not eax
  281. add eax, ecx
  282. bswap eax
  283. mov [esp + ebx*4+20], eax
  284. jnc n6
  285. dec ecx
  286. n6:
  287. dec ecx ;ecx = 0 or 1
  288. cmp ebx, 0
  289. jne loop5
  290.  
  291. pop edx
  292. pop ecx
  293. pop ebx
  294. pop eax
  295. ret
  296.  
  297. ;Вычисляет число, по 16-ричному символу в ch и добавляет его в dh со сдвигом
  298. symbolFromCH:
  299. cmp ch, '9'
  300. ja n1
  301. sub ch, '0'
  302. jmp n2
  303. n1:
  304. sub ch, 'A'
  305. add ch, 10
  306. n2:
  307. shl dh, 4
  308. add dh, ch
  309. ret
  310.  
  311. ;Заполняет ecx байт начиная с ebx символами в dl
  312. myFill:
  313. push eax
  314. mov eax, 0
  315. loop9:
  316. cmp eax, ecx
  317. jae endloop9
  318. mov [ebx], dl
  319. inc ebx
  320. inc eax
  321. jmp loop9
  322. endloop9:
  323. pop eax
  324. ret
  325.  
  326. ;Выводит последние байты DWORD от esp (до вызова функции) до edi в [ebx]
  327. printNum:
  328. push eax
  329. push ecx
  330. mov ecx, esp
  331. add ecx, 12
  332. loop8:
  333. mov eax, [ecx]
  334. add al, '0'
  335. mov [ebx], al
  336. inc ebx
  337. add ecx, 4
  338. cmp ecx, edi
  339. jne loop8
  340. pop ecx
  341. pop eax
  342. ret
  343.  
  344. ;Выводи знак из dl в ebx и делает ebx++, если esi = 1
  345. printSign:
  346. cmp esi, 1
  347. jne n20
  348. mov [ebx], dl
  349. inc bx
  350. n20:
  351. ret
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement