Guest User

Untitled

a guest
Jan 16th, 2018
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.62 KB | None | 0 0
  1. section .rdata
  2. const10: dd 10
  3.  
  4. %define buffer 150
  5. %define flags buffer
  6. %define number_buf 0
  7.  
  8. section .text
  9. global print
  10.  
  11. print:
  12. pushad
  13. sub esp, buffer
  14. xor edi, edi
  15. xor esi, esi
  16. xor ebp, ebp
  17. xor ecx, ecx
  18. xor eax, eax
  19. xor ebx, ebx
  20.  
  21. mov ebx, [esp + buffer + 32 + 12]
  22. mov al, [ebx]
  23. mov byte[esp + flags], al
  24. cmp al, '-'
  25. jne read_symbol
  26. inc ebx
  27.  
  28. read_symbol:
  29. mov al, [ebx]
  30. cmp al, 0
  31. je fin_read
  32.  
  33. or al, 20h
  34. cmp al, 60h
  35. jg char_to_hex
  36. jmp num_to_hex
  37.  
  38. char_to_hex:
  39. sub al, 'a' - 10
  40. jmp put_in_registers
  41.  
  42. num_to_hex:
  43. sub al, '0'
  44. jmp put_in_registers
  45.  
  46. put_in_registers:
  47. shld edi, esi, 4
  48. shld esi, ebp, 4
  49. shld ebp, ecx, 4
  50. shl ecx, 4
  51. or cl, al
  52.  
  53. inc ebx
  54. jmp read_symbol
  55.  
  56. fin_read:
  57. xor ebx, ebx
  58. jmp hex_to_decimal
  59.  
  60. hex_to_decimal:
  61. xor eax, eax
  62. xor edx, edx
  63.  
  64. mov eax, edi
  65. div dword[const10]
  66. mov edi, eax
  67.  
  68. mov eax, esi
  69. div dword[const10]
  70. mov esi, eax
  71.  
  72. mov eax, ebp
  73. div dword[const10]
  74. mov ebp, eax
  75.  
  76. mov eax, ecx
  77. div dword[const10]
  78. mov ecx, eax
  79.  
  80. add edx, '0'
  81. mov byte[esp + number_buf + ebx], dl
  82. inc ebx
  83.  
  84. xor edx, edx
  85. or edx, edi
  86. or edx, esi
  87. or edx, ebp
  88. or edx, ecx
  89. cmp edx, 0
  90. jnz hex_to_decimal
  91.  
  92. mov ebp, [esp + buffer + 32 + 8]
  93. xor eax, eax
  94. xor edi, edi
  95. xor esi, esi
  96. jmp get_special_symbol
  97.  
  98. get_special_symbol:
  99. cmp byte[ebp + edi], '-'
  100. je format_minus
  101. cmp byte[ebp + edi], '+'
  102. je format_plus
  103. cmp byte[ebp + edi], '0'
  104. je format_zero
  105. cmp byte[ebp + edi], ' '
  106. je format_space
  107. jmp get_width
  108.  
  109. format_minus:
  110. or esi, 1
  111. inc edi
  112. jmp get_special_symbol
  113.  
  114. format_plus:
  115. or esi, 2
  116. inc edi
  117. jmp get_special_symbol
  118.  
  119. format_zero:
  120. or esi, 4
  121. inc edi
  122. jmp get_special_symbol
  123.  
  124. format_space:
  125. or esi, 8
  126. inc edi
  127. jmp get_special_symbol
  128.  
  129. get_width:
  130. cmp byte[ebp + edi], 0
  131. je set_width
  132.  
  133. mul dword[const10]
  134. xor edx, edx
  135. mov dl, [ebp + edi]
  136. add eax, edx
  137. sub eax, 00000030h
  138. inc edi
  139. jmp get_width
  140.  
  141. set_width:
  142. cmp ebx, eax
  143. jge greater_length
  144. jmp set_output
  145.  
  146. greater_length:
  147. mov eax, ebx
  148. cmp byte[esp + flags], '-'
  149. je add_width
  150. test esi, 2
  151. jnz add_width
  152. test esi, 8
  153. jnz add_width
  154. jmp set_output
  155.  
  156. add_width:
  157. inc eax
  158. jmp set_output
  159.  
  160. set_output:
  161. mov edx, [esp + buffer + 32 + 4]
  162. test esi, 1
  163. jnz align_left
  164. test esi, 4
  165. jnz fill_zeroes
  166. test esi, 8
  167. jnz fill_spaces
  168. test esi, 2
  169. jnz fill_spaces
  170. jmp fill_spaces
  171.  
  172. align_left:
  173. jmp align_left_set_sign
  174.  
  175. align_left_set_forw_space:
  176. mov byte[edx], ' '
  177. inc edx
  178. dec eax
  179. cmp eax, 0
  180. je fin
  181. jmp align_left_set_next_symb
  182.  
  183. align_left_set_sign:
  184. cmp byte[esp + flags], '-'
  185. je align_left_set_minus
  186. test esi, 2
  187. jnz align_left_set_plus
  188. test esi, 8
  189. jnz align_left_set_forw_space
  190. jmp align_left_set_next_symb
  191.  
  192. align_left_set_minus:
  193. mov byte[edx], '-'
  194. inc edx
  195. dec eax
  196. cmp eax, 0
  197. je fin
  198. jmp align_left_set_next_symb
  199.  
  200. align_left_set_plus:
  201. mov byte[edx], '+'
  202. inc edx
  203. dec eax
  204. cmp eax, 0
  205. je fin
  206. jmp align_left_set_next_symb
  207.  
  208. align_left_set_next_symb:
  209. cmp ebx, 0
  210. je align_left_set_space
  211. jmp align_left_set_number
  212.  
  213. align_left_set_space:
  214. mov byte[edx], ' '
  215. inc edx
  216. dec eax
  217. cmp eax, 0
  218. je fin
  219. jmp align_left_set_next_symb
  220.  
  221. align_left_set_number:
  222. mov cl, [esp + number_buf + ebx - 1]
  223. mov [edx], cl
  224. inc edx
  225. dec ebx
  226. dec eax
  227. cmp eax, 0
  228. je fin
  229. jmp align_left_set_next_symb
  230.  
  231. fill_zeroes:
  232. jmp fill_zeroes_set_sign
  233.  
  234. fill_zeroes_set_forw_space:
  235. mov byte[edx], ' '
  236. inc edx
  237. dec eax
  238. cmp eax, 0
  239. je fin
  240. jmp fill_zeroes_set_zero
  241.  
  242. fill_zeroes_set_sign:
  243. cmp byte[esp + flags], '-'
  244. je fill_zeroes_set_minus
  245. test esi, 2
  246. jnz fill_zeroes_set_plus
  247. test esi, 8
  248. jnz fill_zeroes_set_forw_space
  249. jmp fill_zeroes_set_zero
  250.  
  251. fill_zeroes_set_minus:
  252. mov byte[edx], '-'
  253. inc edx
  254. dec eax
  255. cmp eax, 0
  256. je fin
  257. jmp fill_zeroes_set_zero
  258.  
  259. fill_zeroes_set_plus:
  260. mov byte[edx], '+'
  261. inc edx
  262. dec eax
  263. cmp eax, 0
  264. je fin
  265. jmp fill_zeroes_set_zero
  266.  
  267. fill_zeroes_set_zero:
  268. cmp eax, ebx
  269. jle fill_zeroes_set_number
  270. mov byte[edx], '0'
  271. inc edx
  272. dec eax
  273. cmp eax, 0
  274. je fin
  275. jmp fill_zeroes_set_zero
  276.  
  277. fill_zeroes_set_number:
  278. mov cl, [esp + number_buf + ebx - 1]
  279. mov [edx], cl
  280. inc edx
  281. dec ebx
  282. dec eax
  283. cmp eax, 0
  284. je fin
  285. jmp fill_zeroes_set_number
  286.  
  287. fill_spaces:
  288. jmp fill_spaces_set_space
  289.  
  290. fill_spaces_set_space:
  291. cmp eax, ebx
  292. je fill_spaces_set_sign
  293. mov byte[edx], ' '
  294. inc edx
  295. dec eax
  296. cmp eax, 0
  297. je fin
  298. jmp fill_spaces_set_space
  299.  
  300. fill_spaces_set_sign:
  301. cmp byte[esp + flags], '-'
  302. je fill_spaces_set_minus
  303. test esi, 2
  304. jnz fill_spaces_set_plus
  305. jmp fill_spaces_set_number
  306.  
  307. fill_spaces_set_minus:
  308. mov byte[edx - 1], '-'
  309. jmp fill_spaces_set_number
  310.  
  311. fill_spaces_set_plus:
  312. mov byte[edx - 1], '+'
  313. jmp fill_spaces_set_number
  314.  
  315. fill_spaces_set_number:
  316. mov cl, [esp + number_buf + ebx - 1]
  317. mov [edx], cl
  318. inc edx
  319. dec ebx
  320. dec eax
  321. cmp eax, 0
  322. je fin
  323. jmp fill_spaces_set_number
  324.  
  325. fin:
  326. mov byte[edx], 0
  327. add esp, buffer
  328. popad
  329. ret
Add Comment
Please, Sign In to add comment