Advertisement
Guest User

Untitled

a guest
Mar 29th, 2020
114
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.37 KB | None | 0 0
  1. sys_exit equ 1
  2. sys_write equ 4
  3. stdout equ 1
  4. stdin equ 0
  5.  
  6. %macro turn 0
  7. add r8b,BYTE 1
  8. cmp r8b,BYTE 42
  9. jne %%inc_mod_exit_
  10. mov r8b,BYTE 0
  11. %%inc_mod_exit_:
  12.  
  13. mov dl,r8b
  14. mov cl,33
  15.  
  16. ; sprawdz czy R jest w dowolnej pozycji obrotowej:
  17. cmp dl,cl
  18. je turn_L
  19.  
  20. mov cl,27
  21. cmp dl,cl
  22. je turn_L
  23.  
  24. mov cl,35
  25. cmp dl,cl
  26. je turn_L
  27.  
  28. jmp exit_turn ; R nie jest w pozycji obrotowej
  29.  
  30. turn_L:
  31. add r12b,BYTE 1
  32. cmp r12b,BYTE 42
  33. jne %%inc_mod_exit
  34. mov r12b,BYTE 0
  35. %%inc_mod_exit:
  36.  
  37. exit_turn:
  38. %endmacro
  39.  
  40. %macro print 2
  41. mov rdi,%1
  42. mov rsi,%2
  43. call _print
  44. %endmacro
  45.  
  46. %macro rot_Q_1 2
  47. mov r11b,%1
  48. sub r11b,%2
  49. sub %1,%2
  50.  
  51. cmp r11,90
  52. jle %%le
  53. sub %1,42
  54. jmp %%return
  55. %%le:
  56. cmp r11,49
  57. jge %%return
  58. add %1,42
  59. %%return:
  60. %endmacro
  61.  
  62. %macro rot_Q 2
  63. mov r11b,%1
  64. add r11b,%2
  65. add %1,%2
  66.  
  67. cmp r11,90
  68. jle %%le
  69. sub %1,42
  70. jmp %%return
  71. %%le:
  72. cmp r11,49
  73. jge %%return
  74. add %1,42
  75. %%return:
  76. %endmacro
  77.  
  78. %macro rot_1_R 1 ;przyjmuje znak
  79. xor r11b, r11b
  80. %%loop:
  81. mov al,r11b
  82. movzx rcx, al
  83. mov al,[R + rcx]
  84. add r11,1
  85. cmp al,%1
  86. jne %%loop
  87. mov %1,r11b
  88. add %1,48
  89. %endmacro
  90.  
  91. %macro rot_1_L 1 ;przyjmuje znak
  92. xor r11b, r11b
  93. %%loop:
  94. mov al,r11b
  95. movzx rcx, al
  96. mov al,[L + rcx]
  97. add r11,1
  98. cmp al,%1
  99. jne %%loop
  100. mov %1,r11b
  101. add %1,48
  102. %endmacro
  103.  
  104. %macro rot_R 1 ;przyjmuje adres znaku
  105. sub %1,49
  106. movzx rcx, %1
  107. mov %1,[R + rcx]
  108. %endmacro
  109.  
  110. %macro rot_R_ 1
  111. sub %1,49
  112. movzx rcx, %1
  113. mov %1,[R_ + rcx]
  114. %endmacro
  115.  
  116. %macro rot_L_ 1
  117. sub %1,49
  118. movzx rcx, %1
  119. mov %1,[L_ + rcx]
  120. %endmacro
  121.  
  122. %macro rot_L 1 ;przyjmuje adres znaku
  123. sub %1,49
  124. movzx rcx, %1
  125. mov %1,[L + rcx]
  126. %endmacro
  127.  
  128. %macro rot_T 1 ;przyjmuje znaku
  129. sub %1,49
  130. movzx rcx, %1
  131. mov %1,[T + rcx]
  132. %endmacro
  133.  
  134. %macro read_arg 3
  135. mov rsi,[rsp + %1]
  136. xor rax,rax
  137.  
  138. %%arg_loop:
  139. mov r14b,[rsi+rax]
  140.  
  141. cmp r14b,91
  142. jge %%end_arg_loop
  143.  
  144. cmp r14b,48
  145. jle %%end_arg_loop
  146.  
  147. mov [%2+rax],r14b
  148. add rax,1
  149.  
  150. cmp rax,%3
  151. jg %%end_arg_loop
  152. jmp %%arg_loop
  153. %%end_arg_loop:
  154. cmp r14b,0
  155. jz %%correct
  156. xor rax,rax
  157. %%correct:
  158. %endmacro
  159.  
  160. section .data
  161.  
  162. newline db 0xA
  163.  
  164. section .bss
  165. input resb 4096
  166. output resb 4096
  167. L resb 48
  168. R resb 48
  169. T resb 48
  170. KEY resb 4096
  171. R_ resb 48
  172. L_ resb 48
  173.  
  174. section .text
  175. global _start
  176.  
  177. _start:
  178.  
  179. pop rcx
  180. cmp rcx,2
  181. jle error
  182. push rcx
  183.  
  184. read_arg 16,L,42
  185. cmp rax,42
  186. jne error
  187.  
  188. read_arg 24,R,42
  189. cmp rax,42
  190. jne error
  191.  
  192. read_arg 32,T,42
  193. cmp rax,42
  194. jne error
  195.  
  196. read_arg 40,KEY,2
  197. cmp rax,2
  198. jne error
  199.  
  200. mov r8b,48
  201. loop_R_:
  202. add r8b,1
  203. cmp r8b,91
  204. je end_loop_R_
  205. mov r12b,r8b
  206. rot_1_R r12b
  207. movzx rax,r8b
  208. sub rax,49
  209. mov [R_ + rax],BYTE r12b
  210. jmp loop_R_
  211. end_loop_R_:
  212.  
  213. mov r8b,48
  214. loop_L_:
  215. add r8b,1
  216. cmp r8b,91
  217. je end_loop_L_
  218. mov r12b,r8b
  219. rot_1_L r12b
  220. movzx rax,r8b
  221. sub rax,49
  222. mov [L_ + rax],BYTE r12b
  223. jmp loop_L_
  224. end_loop_L_:
  225.  
  226. ; ustawienie pozycji startowej L:
  227. mov r12b,[KEY]
  228. sub r12b,49
  229.  
  230. ; ustawienie pozycji startowej R:
  231. mov r8b,[KEY+1]
  232. sub r8b,49
  233.  
  234.  
  235. read_loop: ;petla do wczytywanie danych z standartowego wejscia (blokami)
  236.  
  237. mov rax, 3 ;Wczytuje blok 8 bitow do input
  238. mov rbx, stdin
  239. mov rcx, input
  240. mov rdx, 4096
  241. int 80h
  242.  
  243. mov r13,rax ;Zapisuje sobie liczbe wczytanych bitow
  244.  
  245. cmp rax,1 ;Jezeli nie wczytano zadnego bitu to koncze
  246. jle end_read_loop
  247.  
  248. xor r10,r10 ;r10 licznik bitow w bloku
  249.  
  250. loop_block: ;petla po bloku (szyfrowanie)
  251.  
  252. lea r15,[input + r10] ;zaladuj do r15 adres znaku do zaszyfrowania
  253. mov r9b,[r15] ;zaladuj do r9b w.w. znak
  254.  
  255. cmp r9b,10
  256. je end_read_loop
  257.  
  258. cmp r9b,48 ;jezeli znak nie spelnia zalozen tzn nie jest z zakresu ['1','Z'] zakoncz program z kodem bledu
  259. jle error
  260. cmp r9b,91
  261. jge error
  262.  
  263. turn ;obrot bebenkow
  264.  
  265. ;SZYFROWANIE:
  266.  
  267. rot_Q r9b,r8b ;Qr
  268. rot_R r9b ;R
  269. rot_Q_1 r9b,r8b ;Qr-1
  270. rot_Q r9b,r12b ;Ql
  271. rot_L r9b ;L
  272. rot_Q_1 r9b,r12b ;Ql-1
  273. rot_T r9b ;T
  274. rot_Q r9b,r12b ;Ql
  275. rot_L_ r9b ;L-1
  276. rot_Q_1 r9b,r12b ;Ql-1
  277. rot_Q r9b,r8b ;Qr
  278. rot_R_ r9b ;R-1
  279. rot_Q_1 r9b,r8b ;Qr-1
  280. add r11b,1
  281.  
  282. mov [output + r10],r9b ;kopiuje zaszyfrowany znak do output
  283.  
  284. add r10,1 ;przechodze do nastepnego znaku
  285.  
  286. cmp r10,r13 ;sprawdzam czy nie jest to ostatni wczytany znak
  287. jl loop_block ;jezeli nie jest to ostatni to przechodze do nastepnego znaku
  288.  
  289. cmp r13,4096
  290. jl end_read_loop ;jezeli znakow bylo mniej niz 8 to znaczy ze jest to koniec bloku (oraz calego napisu)
  291.  
  292.  
  293. ;jezeli jest ostatni ale znakow bylo 8 to jest to koniec bloku ale nie koniecznie koniec calego napisu
  294.  
  295. end_loop_block: ;jest to juz konec napisu
  296.  
  297. print output,r13 ;wyswietl zaszyfrowany blok
  298.  
  299. jmp read_loop
  300. end_read_loop:
  301.  
  302. print output,r13 ;wyswietl zaszyfrowany blok
  303.  
  304. exit:
  305. print newline,1
  306.  
  307. mov rax, 60
  308. xor rdi,rdi
  309. syscall
  310.  
  311. error:
  312.  
  313. print output,r13
  314.  
  315. mov rax, 60
  316. mov rdi, 1
  317. syscall
  318.  
  319. _print: ;rdi -> adres rsi -> dlugosc
  320. mov rcx,rdi
  321. mov rdx,rsi
  322. mov rax, sys_write
  323. mov rbx, stdout
  324. int 80h
  325. ret
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement