Advertisement
Luszak

cezar asm

Mar 23rd, 2017
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. # Szyfr Cezara
  2. # %dl klucz dla liter
  3. # %dh klucz dla liczb
  4. .data
  5. SYSREAD = 0
  6. SYSWRITE = 1
  7. SYSEXIT = 60
  8.  
  9. STDIN = 0
  10. STDOUT = 1
  11.  
  12. EXIT_SUCCESS = 0
  13. EXIT_ERR = 1
  14. BUFLEN = 512
  15. KEY = 53
  16. ZCODE = 0x30    # zero code
  17. NCODE = 0x3A    # nine code + 1
  18. BACODE = 0x41   # A code
  19. BZCODE = 0x5B   # Z code + 1
  20. SACODE = 0x61   # a code
  21. SZCODE = 0x7B   # z code + 1
  22. LETTER_FIX = 26
  23. NUMBER_FIX = 10
  24.  
  25. key: .ascii "26"
  26. key_len = .-key
  27. err_msg: .ascii "Klucz zawiera niedozwolone znaki\n"
  28. err_msg_len = .-err_msg
  29.  
  30. .bss
  31. .comm textin, 512
  32. .comm textout, 512
  33. .comm lkey, 1
  34. .comm nkey, 1
  35.  
  36. .text
  37. .global main
  38.  
  39. main:
  40. nop
  41. movq $SYSREAD, %rax
  42. movq $STDIN, %rdi
  43. movq $textin, %rsi
  44. movq $BUFLEN, %rdx
  45. syscall
  46.  
  47. movq $0, %rdx
  48. movq %rax, %r8
  49. dec %r8 # pokazuje na '\n'
  50. movq $0, %rdi   # licznik
  51.  
  52. make_key:
  53. # %cl znak
  54. # %r10 wartosc klucza
  55. movb $10, %al
  56. movw $0, %cx
  57. movb key(,%rdi,1), %cl
  58. cmp $ZCODE, %cl
  59. jl err_end
  60. cmp $NCODE, %cl
  61. jge err_end
  62. subw $ZCODE, %cx
  63. movw %r10w, %dx
  64. mulw %dx
  65. movw %ax, %dx
  66. addw %cx, %dx
  67. addw %dx, %r10w
  68. inc %rdi
  69. cmp $key_len, %rdi
  70. jne make_key
  71.  
  72. #dzielenie klucza
  73.  
  74. movq $0, %rdx
  75. movq %r10, %rax
  76. movq $26, %rbx
  77. divq %rbx
  78. movq %rdx, %r11
  79.  
  80. movq $0, %rdx
  81. movw %r10w, %ax
  82. movw $10, %bx
  83. divw %bx
  84. movw %dx, %r12w
  85.  
  86. movq $0, %rdi
  87. loop:
  88. cmp %rdi, %r8
  89. je end
  90.  
  91. movb textin(,%rdi, 1), %cl  # n
  92.  
  93. # 0<n<9 ?
  94. movb $ZCODE, %bl
  95. movb $NCODE, %bh
  96. cmp %cl, %bl
  97. jg no_change
  98. cmp %cl, %bh
  99. jg change_number
  100.  
  101. # A<n<Z ?
  102. movb $BACODE, %bl
  103. movb $BZCODE, %bh
  104. cmp %cl, %bl
  105. jg no_change
  106. cmp %cl, %bh
  107. jg change_letter
  108. jmp no_change
  109.  
  110. change_letter:
  111. add %r11b, %cl
  112. # n>Z?
  113. cmp $'Z', %cl
  114. jg letter_overflow
  115. movb %cl, textout(,%rdi, 1)
  116. inc %rdi
  117. jmp loop
  118.  
  119. letter_overflow:
  120. subb $LETTER_FIX, %cl
  121. # n>Z?
  122. cmp $'Z', %cl
  123. jg letter_overflow
  124. movb %cl, textout(,%rdi, 1)
  125. inc %rdi
  126. jmp loop
  127.  
  128. change_number:
  129. add %r12b, %cl
  130. # n>9?
  131. cmp $'9', %cl
  132. jg number_overflow
  133. movb %cl, textout(,%rdi, 1)
  134. inc %rdi
  135. jmp loop
  136.  
  137. number_overflow:
  138. subb $NUMBER_FIX, %cl
  139. # n>9?
  140. cmp $'9', %cl
  141. jg number_overflow
  142. movb %cl, textout(,%rdi, 1)
  143. inc %rdi
  144. jmp loop
  145.  
  146. no_change:
  147. movb %cl, textout(,%rdi,1)
  148. inc %rdi
  149. jmp loop
  150.  
  151. end:
  152. movb $'\n', textout(,%rdi,1)
  153. movq $SYSWRITE, %rax
  154. movq $STDOUT, %rdi
  155. movq $textout, %rsi
  156. movq $BUFLEN, %rdx
  157. syscall
  158.  
  159. movq $SYSEXIT, %rax
  160. movq $EXIT_SUCCESS, %rdi
  161. syscall
  162.  
  163. err_end:
  164. movq $SYSWRITE, %rax
  165. movq $STDOUT, %rdi
  166. movq $err_msg, %rsi
  167. movq $err_msg_len, %rdx
  168. syscall
  169.  
  170. movq $SYSEXIT, %rax
  171. movq $EXIT_ERR, %rdi
  172. syscall
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement