Advertisement
Guest User

Untitled

a guest
Mar 20th, 2019
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.13 KB | None | 0 0
  1. SYS_READ = 0
  2. SYS_WRITE = 1
  3. SYS_OPEN = 2
  4. SYS_CLOSE = 3
  5. SYS_EXIT = 60
  6.  
  7. .bss
  8. .comm input_buffer 1024
  9. .comm input_length 8
  10. .comm number1 1024
  11. .comm number2 1024
  12. .comm answer 1025
  13. .comm itoa_buffer 4096
  14. .comm out_buffer 4096
  15. .comm fdcopy 8
  16. .data
  17. num1_txt:
  18. .asciz "number1.txt"
  19. num2_txt:
  20. .asciz "number2.txt"
  21. answ_txt:
  22. .asciz "answer.txt"
  23. .text
  24. .globl _start
  25.  
  26. _start:
  27. mov $SYS_OPEN, %rax
  28. mov $num1_txt, %rdi
  29. mov $0, %rsi
  30. mov $0, %rdx
  31. syscall #otworz plik "number1.txt"
  32. cmp $0, %rax #zero w rax = blad przy otworzeniu pliku
  33. je fail # idz do fail
  34. #jezeli jestesmy tutaj
  35. #to plik sie otworzyl
  36.  
  37. mov %rax, fdcopy
  38.  
  39. mov $SYS_READ, %rax
  40. mov fdcopy, %rdi
  41. mov $input_buffer,%rsi
  42. mov $1023, %rdx
  43. syscall # przeczytaj 1023 max bajtow z pliku do buffora input_buffer
  44. # w rax jest dlugosc stringa
  45.  
  46. mov %rax, input_length
  47. mov $number1, %rdi
  48. call convert_ascii_to_binary_number
  49. after_convo:
  50. mov $SYS_CLOSE, %rax
  51. mov fdcopy, %rdi
  52. syscall #zamknij plik
  53.  
  54. #otworz plik z number2
  55. mov $SYS_OPEN, %rax
  56. mov $num2_txt, %rdi
  57. mov $0, %rsi
  58. mov $0, %rdx
  59. syscall #otworz plik "number1.txt"
  60. cmp $0, %rax #zero w rax = blad przy otworzeniu pliku
  61. je fail # idz do fail
  62. #jezeli jestesmy tutaj
  63. #to plik sie otworzyl
  64.  
  65. mov %rax, fdcopy
  66.  
  67. mov $SYS_READ, %rax
  68. mov fdcopy, %rdi
  69. mov $input_buffer,%rsi
  70. mov $1023, %rdx
  71. syscall # przeczytaj 1023 max bajtow z pliku do buffora input_buffer
  72. # w rax jest dlugosc stringa
  73. mov %rax, input_length
  74. mov $number2, %rdi
  75. call convert_ascii_to_binary_number
  76.  
  77. mov $SYS_CLOSE, %rax
  78. mov fdcopy, %rdi
  79. syscall #zamknij plik
  80.  
  81. call adder
  82. mov answer, %rsi
  83. call big_number_to_ascii
  84. mov $SYS_OPEN, %rax
  85. mov $answ_txt, %rdi
  86. mov $102, %rsi #flags 2 = write and read, 100 = create if not exist
  87. mov $0, %rdx
  88. syscall
  89. brk:
  90. cmp $0, %rax
  91. je fail
  92.  
  93. mov %rax, fdcopy
  94.  
  95. mov $SYS_WRITE, %rax
  96. mov fdcopy, %rdi
  97. mov $out_buffer, %rsi
  98. mov $1023, %rdx
  99. syscall #wypisz do konsolii (1 = stdout)
  100.  
  101. mov $SYS_CLOSE, %rax
  102. mov fdcopy, %rdi
  103. syscall #zamknij plik
  104.  
  105.  
  106.  
  107. fail:
  108. mov $SYS_EXIT, %rax
  109. mov $999, %rdi
  110. syscall
  111. ################################ CONVERTER #################################
  112. ############################################################################
  113. ############################################################################
  114. ############################################################################
  115. ############################################################################
  116. convert_ascii_to_binary_number: # w rax jest pointer do buffora gdzie mamy zapisac liczbe
  117. mov input_length, %rcx
  118. sub $3, %rcx
  119.  
  120. xor %rsi, %rsi # zeruj counter na output
  121.  
  122. loop:
  123. movb input_buffer(%rcx), %al
  124. cmp $'0', %al
  125. jl not_a_number
  126. cmp $'9', %al
  127. jg not_a_number
  128. #jezeli jestesmy tutaj, to al zawiera cyfre
  129. sub $'0', %al
  130. jmp we_got_a_digit
  131. not_a_number:big_number_to_ascii
  132. cmp $big_number_to_ascii
  133. jl fabig_number_to_ascii
  134. cmp $big_number_to_ascii
  135. jg fabig_number_to_ascii
  136. big_number_to_ascii
  137. sub $big_number_to_ascii
  138.  
  139. we_got_a_digit:
  140. shl $4, %al #przesun al o 4 bity w lewo (0xa = 0xa0)
  141. mov %al, %bl
  142. inc %rcx
  143.  
  144. movb input_buffer(%rcx), %al
  145. cmp $'0', %al
  146. jl not_a_number2
  147. cmp $'9', %al
  148. jg not_a_number2
  149. #jezeli jestesmy tutaj, to al zawiera cyfre
  150. sub $'0', %al
  151. jmp we_got_a_digit2
  152. not_a_number2:
  153. cmp $'a', %al
  154. jl fail
  155. cmp $'f', %al
  156. jg fail
  157. #jezeli jestesmy tutaj, to al zawiera literke (a-f)
  158. sub $('a' - 10), %al
  159.  
  160. we_got_a_digit2:
  161. add %al, %bl
  162. movb %bl, (%rdi, %rsi) # przenies bl do %rdi[%rsi]
  163. inc %rsi
  164. sub $3, %rcx
  165. cmp $0, %rcx
  166. jge loop
  167. end_of_conversion:
  168. ret
  169.  
  170.  
  171. ################################ DODAWANIE #################################
  172. ############################################################################
  173. ############################################################################
  174. ############################################################################
  175. ############################################################################
  176.  
  177. adder:
  178. xor %rax, %rax # zeruj counter
  179. mov $1024/8, %rbx # ile razy chcemy dodawac bajty ? (max rozmiar 1024 bajty. Dodaje co 8 bajtow, wiec ilosc petli = 1024/8)
  180. xor %rcx, %rcx # zeruj counter
  181. clc # wyzeruj carry flag (flaga przeniesienia)
  182. pushf
  183. loop1:
  184. popf
  185. mov number1(,%rax, 8), %rsi
  186. mov number2(,%rax, 8), %rdi
  187. adc %rsi, %rdi #adc = rsi + rdi + carry
  188. mov %rdi, answer(,%rax, 8)
  189. pushf # wrzuc flagi (miedzy innymi carry)
  190. dec %rbx # jezeli dec sprawie, ze rbx bedzie rowny 0, to ustawi flage 'zero'
  191. jnz loop1 # jump if not zero, czyli rob petle jezeli rbx nie jest zero
  192. popf
  193. ret
  194.  
  195.  
  196. big_number_to_ascii:
  197. # teraz zamienay liczbe na text w bazie 8kowej
  198. xor %rcx, %rcx # zerujemy licznik
  199. mov %rsi, %rax # dzielimy liczbe (div wymaga rax)
  200. mov $8, %rbx # wrzuc 7 do rbx, bo chcemy dzielic przez 7
  201.  
  202. loopx:
  203. xor %rdx, %rdx # zeruj rdx
  204. div %rbx #rdx:rax / 7 (rbx)
  205.  
  206. add $'0', %rdx # dodaj ascii zero do reszty z dzielenia
  207. mov %dl, itoa_buffer(%rcx) #wrzuc cyfre ascii do buffora
  208. inc %ecx #dodaj +1 do licznika buffora
  209. cmp $0, %rax #jezeli wynik dzielenia == 0
  210. jne loopx # to koniec petli
  211. po_itoa:
  212. dec %rcx #poprzednia funkcja zostawia w ecx dlugosc
  213. # stringa
  214. xor %rsi, %rsi #zeruj licznik
  215. loop3:
  216. mov itoa_buffer(%rcx), %al #czytaj bajt z buffora
  217. mov %al, out_buffer(%rsi) #zapisz do nowego buffora
  218. inc %rsi #+1 nowy buffor
  219. dec %rcx #-1 stary buffor
  220. cmp $0, %rcx
  221. jge loop3
  222.  
  223. ret
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement