Advertisement
Guest User

Untitled

a guest
Sep 27th, 2016
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.95 KB | None | 0 0
  1. .global _start
  2.  
  3. .bss
  4. #-Буфер------------------------------------------------------------------------
  5. .lcomm text, 700000
  6. .lcomm buffer, 1024
  7. .lcomm text_in_line, 100000
  8. .lcomm dec, 11
  9. #------------------------------------------------------------------------------
  10.  
  11. .text
  12. good_exit:
  13.  
  14. movq $1, %rax
  15. movq $1, %rdi
  16. movq $countstr, %rsi
  17. movq $countstrlen, %rdx
  18. syscall
  19.  
  20. movq $1, %rax
  21. movq $1, %rdi
  22. movq $red, %rsi
  23. movq $red_len, %rdx
  24. syscall
  25.  
  26. _conv_to_dec:
  27. pushq $dec+11
  28. popq %rsi
  29. movq $0xa, (%rsi)
  30. movq result_count, %rax
  31. movq $0xa, %rbx
  32. mov $1, %rcx
  33. _next_digit:
  34. inc %rcx
  35. xor %rdx, %rdx
  36. div %rbx
  37. addq $0x30, %rdx
  38. dec %rsi
  39. movb %dl, (%rsi)
  40. cmp $0, %rax
  41. jnz _next_digit
  42. movq %rcx, %rdx
  43. movq $1, %rax
  44. movq $1, %rdi
  45. syscall
  46.  
  47. movq $1, %rax
  48. movq $1, %rdi
  49. movq $nocolor, %rsi
  50. movq $nocolor_len, %rdx
  51. syscall
  52.  
  53.  
  54.  
  55. xorq %rbx, %rbx
  56. movq $60, %rax
  57. syscall
  58.  
  59. bad_exit:
  60. # Выход с 1 кодом ошибки
  61. movq $1, %rbx
  62. movq $60, %rax
  63. syscall
  64. #------------------------------------------------------------------------------
  65.  
  66. #-Работа с файлом--------------------------------------------------------------
  67. open_file:
  68. # Открывает файл, указанный в rdi и сохраняет fd в rax
  69. movq $2, %rax
  70. xorq %rsi, %rsi
  71. syscall
  72. ret
  73.  
  74. close_file:
  75. # Закрывает fd, указанный в rdi
  76. movq $3, %rax
  77. syscall
  78. ret
  79.  
  80. close_file_by_file:
  81. # Закрывает файл из file
  82. movq file, %rdi
  83. call close_file
  84. ret
  85.  
  86. open_file_by_file_path:
  87. # Открывает файл, указанный в file_path и сохраняет fd в file
  88. movq file_path, %rdi
  89. call open_file
  90. movq %rax, file
  91. ret
  92.  
  93. read_text_from_file:
  94. # Читает файл из file в text
  95. xorq %rax, %rax
  96. movq file, %rdi
  97. movq $text, %rsi
  98. movq $1000000, %rdx
  99. syscall
  100. ret
  101. #------------------------------------------------------------------------------
  102.  
  103. #-Вывод------------------------------------------------------------------------
  104. write:
  105. # Выводит в поток, указанный в rdi,
  106. # строку, ссылка на которую в rsi,
  107. # длины rdx
  108. movq $1, %rax
  109. syscall
  110. ret
  111.  
  112. stdout:
  113. # Печатает в stdout строку, ссылка на которую в rsi, длины rdx
  114. movq $1, %rdi
  115. call write
  116. ret
  117.  
  118. stderr:
  119. # Печатает в stderr строку, ссылка на которую в rsi, длины rdx
  120. movq $2, %rdi
  121. call write
  122. ret
  123.  
  124. print_text_in_line:
  125. # Печатает содержимое text_in_line в stdout
  126. addq $1, result_count
  127. call print_register
  128. xorq %r12, %r12
  129. print_text_in_line_loop:
  130. movq $text_in_line, %r14
  131. addq %r12, %r14
  132. movq %r14, %rsi
  133. movq $1, %rdx
  134. call stdout
  135. # Если это \n
  136. cmpb $10, (%r14)
  137. je ptil
  138. # Если это конец файла
  139. cmpb $0, (%r14)
  140. je ptil
  141. # Если не конец строки
  142. cmpq %r14, find_index
  143. jne ptil_next_0
  144. movq $red, %rsi
  145. movq $red_len, %rdx
  146. call stdout
  147.  
  148. ptil_next_0:
  149. movq find_index, %r13
  150. addq find_len, %r13
  151. cmpq %r14, %r13
  152. jne ptil_next
  153. movq $nocolor, %rsi
  154. movq $nocolor_len, %rdx
  155. call stdout
  156.  
  157. ptil_next:
  158. addq $1, %r12
  159. jmp print_text_in_line_loop
  160. ptil:
  161. ret
  162.  
  163. print_register:
  164. # Печатает!
  165. movq $green, %rsi
  166. movq $green_len, %rdx
  167. call stdout
  168. movq len, %r14
  169. movq $0, %r13
  170. pushq $0x20
  171. pushq $0x3A
  172. pushq $0x20
  173. _conv_loop:
  174. movq %r14, %r15
  175. and $0x0f, %r15
  176. cmpq $0x9, %r15
  177. ja _gt9
  178. addq $0x30, %r15
  179. jmp _conv
  180.  
  181. _gt9:
  182. addq $0x37, %r15
  183.  
  184. _conv:
  185. pushq %r15
  186. addq $1, %r13
  187. shr $4, %r14
  188. cmpq $7, %r13
  189. jne _conv_loop
  190. movq $0, %r13
  191. _write_loop:
  192. addq $1, %r13
  193. movq $1, %rax
  194. movq $1, %rdi
  195. popq buffer
  196. movq $buffer, %rsi
  197. movq $1, %rdx
  198. syscall
  199. cmpq $10, %r13
  200. jne _write_loop
  201. movq $nocolor, %rsi
  202. movq $nocolor_len, %rdx
  203. call stdout
  204. ret
  205. #------------------------------------------------------------------------------
  206.  
  207. #-Извлечение-------------------------------------------------------------------
  208. get_one_byte:
  209. # Извлекаем 1 байт из text(итератор) и кладем в строку по адресу r14
  210. movq $text, %r13
  211. addq byte_number, %r13
  212. movb (%r13), %al
  213. movb %al, (%r14)
  214. addq $1, byte_number
  215. addq $1, temp_len
  216. ret
  217.  
  218. clear_text_in_line:
  219. # Очищаем text_in_line от прошлой строки
  220. xorq %r15, %r15
  221. for_byte_in_dirty_line:
  222. movq $text_in_line, %r14
  223. addq %r15, %r14
  224. movb $0, (%r14)
  225. addq $1, %r15
  226. cmpq $100001, %r15
  227. jne for_byte_in_dirty_line
  228. ret
  229.  
  230. get_one_line:
  231. # Читает 1 строку из text в text_in_line
  232. call clear_text_in_line
  233. xorq %r15, %r15
  234. for_each_byte_in_line:
  235. # Смотрим очередной байт
  236. movq $text_in_line, %r14
  237. addq %r15, %r14
  238. call get_one_byte
  239. # Если это \n
  240. cmpb $10, (%r14)
  241. je read_one_byte_finish
  242. # Если это конец файла
  243. cmpb $0, (%r14)
  244. je read_one_byte_end_file
  245. # Если не конец строки
  246. addq $1, %r15
  247. jmp for_each_byte_in_line
  248. read_one_byte_finish:
  249. addq $1, row
  250. ret
  251. read_one_byte_end_file:
  252. movb $1, finished_flag
  253. ret
  254. #------------------------------------------------------------------------------
  255.  
  256. #-Остальное--------------------------------------------------------------------
  257. get_2_arg:
  258. xorq %r15, %r15
  259. for_f_arg:
  260. movq file_path, %r14
  261. addq %r15, %r14
  262. # Если это \n
  263. cmpb $10, (%r14)
  264. je get_a
  265. # Если это 0
  266. cmpb $0, (%r14)
  267. je get_a
  268. # Если еще не все
  269. addq $1, %r15
  270. jmp for_f_arg
  271. get_a:
  272. addq $1, %r15
  273. addq file_path, %r15
  274. movq %r15, find
  275. call get_find_len
  276. ret
  277.  
  278. get_find_len:
  279. xorq %r15, %r15
  280. for_fl:
  281. movq find, %r14
  282. addq %r15, %r14
  283. # Если это \n
  284. cmpb $10, (%r14)
  285. je get_ll
  286. # Если это 0
  287. cmpb $0, (%r14)
  288. je get_ll
  289. # Если еще не все
  290. addq $1, %r15
  291. jmp for_fl
  292. get_ll:
  293. movq %r15, find_len
  294. ret
  295. _clear:
  296. movq $clr, %rsi
  297. movq $clrlen, %rdx
  298. call stdout
  299. ret
  300.  
  301. #------------------------------------------------------------------------------
  302.  
  303. #-Main-------------------------------------------------------------------------
  304. _start:
  305. popq %rdi
  306. popq %rdi
  307. popq file_path
  308. call get_2_arg
  309. call _clear
  310. call open_file_by_file_path
  311. call read_text_from_file
  312. call close_file_by_file
  313.  
  314. for_each_line:
  315. call get_one_line
  316. call find_string_in_line
  317. cmpb $1, finded_flag
  318. jne skip_print
  319. call print_text_in_line
  320. skip_print:
  321. movq temp_len, %r11
  322. addq %r11, len
  323. movq $0, temp_len
  324. # Если кончился файл
  325. cmpb $1, finished_flag
  326. je good_exit
  327. jmp for_each_line
  328. jmp good_exit
  329. #------------------------------------------------------------------------------
  330.  
  331. #-Поиск------------------------------------------------------------------------
  332. find_string_in_line:
  333. xorq %r15, %r15
  334. xorq %r8, %r8
  335. for_each_byte_in_line_for_find:
  336. # Смотрим очередной байт
  337. movq $text_in_line, %r14
  338. addq %r15, %r14
  339. movq find, %r9
  340. addq %r8, %r9
  341. movb (%r9), %al
  342. movb (%r14), %dl
  343. cmpb %al, %dl
  344. je next
  345. # Если это \n
  346. cmpb $10, (%r14)
  347. je find_finish
  348. # Если это конец файла
  349. cmpb $0, (%r14)
  350. je find_finish
  351. # Если не конец строки
  352. cmpq $0, %r8
  353. jne xoring
  354. addq $1, %r15
  355. xoring:
  356. xorq %r8, %r8
  357. jmp for_each_byte_in_line_for_find
  358. next:
  359. addq $1, %r8
  360. addq $1, %r15
  361. cmpq find_len, %r8
  362. jne for_each_byte_in_line_for_find
  363. movb $1, finded_flag
  364. subq find_len, %r14
  365. movq %r14, find_index
  366. ret
  367. find_finish:
  368. movb $0, finded_flag
  369. ret
  370. #------------------------------------------------------------------------------
  371.  
  372. .data
  373. #-Переменные-------------------------------------------------------------------
  374. file_path: .quad 0
  375. find: .quad 0
  376. find_len: .quad 0
  377. find_index: .quad 0
  378. file: .byte 0
  379. row: .quad 0
  380. len: .quad 0
  381. temp_len: .quad 0
  382. byte_number: .quad 0
  383. finished_flag: .byte 0
  384. finded_flag: .byte 0
  385. clr : .asciz "\033[H\033[2J"
  386. clrlen = . - clr
  387. red: .asciz "\033[101m"
  388. red_len = . - red
  389. green: .asciz "\033[0;32m"
  390. green_len = . - green
  391. nocolor: .asciz "\033[0m\033[K"
  392. nocolor_len = . - nocolor
  393. endfile : .ascii "\n"
  394. endfilelen = . - endfile
  395. countstr : .ascii "Count : "
  396. countstrlen = . - countstr
  397. result_count: .int 00
  398. #------------------------------------------------------------------------------
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement