Guest User

Untitled

a guest
Apr 22nd, 2018
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.99 KB | None | 0 0
  1. INCLUDE Irvine32.inc
  2. ExitProcess proto,dwExitCode:dword
  3.  
  4. ; Adat
  5. .data
  6. Str_Mode DB "Kodolas vagy dekodolas? K/D ", 0
  7. Str_Shift DB "Eltolas? ", 0
  8. Str_Code DB "Szoveg? ", 0
  9. Str_Result DB "Kimenet: ", 34, 0 ; 34 = "
  10. Str_Quote DB 34, 0 ; Egy idézőjel
  11. Str_Invalid DB "Hibas adat!", 10, 0
  12. Str_NewLine DB 10, 0 ; Új sor
  13. Str_ExitTxt DB 10, "Nyomj meg egy gombot a kilepeshez...", 0
  14.  
  15. _Mode DB 0 ; Mód változó (0 - Kódolás, 1 - Dekódolás)
  16. _Offset DD 0 ; Kódolás eltolása
  17.  
  18. InputMax = 256
  19. _Input DB InputMax+1 dup (?) ; Kód buffer, max 256 karakter + 0 végére
  20. _InputLength DD 0
  21.  
  22. ; Kód
  23. .code
  24. main proc
  25.  
  26. ; Infók bekérése
  27. Label_GetMode:
  28. ; Kódolási mód bekérése
  29. mov edx, offset Str_Mode
  30. call WriteString
  31.  
  32. call ReadChar ; Bekérem a karaktert
  33.  
  34. call WriteChar ; Kiírom a bemenetet
  35.  
  36. mov edx, offset Str_NewLine
  37. call WriteString
  38.  
  39. cmp AL, 'K' ; Kódolás mód?
  40. je Label_ModeCode
  41. cmp AL, 'k' ; Kódolás mód? Kisbetűvel
  42. je Label_ModeCode
  43.  
  44. cmp AL, 'D' ; Dekódolás?
  45. je Label_ModeDecode
  46. cmp AL, 'd' ; Dekódolás? Kisbetűvel
  47. je Label_ModeDecode
  48.  
  49. ; Hibás bemeneti adat
  50. mov edx, offset Str_Invalid
  51. call WriteString
  52.  
  53. jmp Label_GetMode
  54.  
  55. Label_ModeCode:
  56. mov _Mode, 0
  57. jmp Label_GetOffset
  58.  
  59. Label_ModeDecode:
  60. mov _Mode, 1
  61.  
  62.  
  63. Label_GetOffset:
  64. ; Eltolás bekérése
  65. mov edx, offset Str_Shift
  66. call WriteString
  67.  
  68. call ReadInt
  69.  
  70. cmp eax, 0
  71. jl Label_OffsetInvalid
  72. jmp Label_OffsetOK
  73.  
  74. Label_OffsetInvalid:
  75. ; Hibás bemeneti adat (kisebb mint 0)
  76. mov edx, offset Str_Invalid
  77. call WriteString
  78.  
  79. jmp Label_GetOffset
  80.  
  81. Label_OffsetOK:
  82. cmp _Mode, 1 ; Ha a mód dekódolás
  83. je Label_OffsetNeg
  84. jmp Label_OffsetStore
  85.  
  86. Label_OffsetNeg:
  87. neg eax
  88.  
  89. Label_OffsetStore:
  90. mov _Offset, eax
  91.  
  92.  
  93. Label_GetInput:
  94. ; Bemeneti kód bekérése
  95. mov edx, offset Str_Code
  96. call WriteString
  97.  
  98. mov edx, offset _Input
  99. mov ecx, InputMax
  100. call ReadString
  101.  
  102. mov _InputLength, eax ; EAX tartalmazza a beírt szöveg hosszát
  103.  
  104.  
  105. Label_DoCode:
  106. ; Caesar kódolás
  107. mov eax, 0 ; EAX tárolja az éppen kódolandó karaktert (pontosabban AL, de az egészet kiürítem)
  108. mov ecx, 0 ; ECX számolja hogy hol járok a bemeneti szövegben
  109.  
  110. Label_CodeLoop:
  111.  
  112. ; Átrakom a szöveg karakterét AL-be
  113. mov edx, offset _Input
  114. add edx, ecx
  115. mov al, [edx]
  116.  
  117. ; Megnézem, hogy a karakter kis vagy nagybetű
  118. cmp al, 'a'
  119. jge Label_AboveLowerA ; Ha a betű kis 'a' vagy nagyobb ascii kód
  120.  
  121. cmp al, 'A'
  122. jge Label_AboveUpperA ; Ha a betű nagy 'A' vagy nagyobb ascii kód
  123.  
  124. ; Ha egyik se, akkor nem csinálok vele semmit
  125. jmp Label_CodeLoopEnd
  126.  
  127. Label_AboveLowerA:
  128. cmp al, 'z'
  129. jle Label_BelowLowerZ ; Ha a betű kis 'z' vagy kisebb ascii kód
  130. jmp Label_CodeLoopEnd ; Nem kisbetű
  131.  
  132. Label_BelowLowerZ:
  133. ; Itt már biztos vagyok benne, hogy a betű kis betű
  134. mov ebx, 0
  135. jmp Label_ShiftCharacter
  136.  
  137.  
  138. Label_AboveUpperA:
  139. cmp al, 'Z'
  140. jle Label_BelowUpperZ ; Ha a betű nagy 'Z' vagy kisebb ascii kód
  141. jmp Label_CodeLoopEnd ; Nem nagybetű
  142.  
  143. Label_BelowUpperZ:
  144. ; Itt már biztos vagyok benne, hogy a betű nagybetű
  145. mov ebx, 1
  146.  
  147. ; Kisbetűt csinálok AL-ből
  148. add al, 32
  149.  
  150. jmp Label_ShiftCharacter
  151.  
  152.  
  153. Label_ShiftCharacter: ; Itt történik az eltolás, bemenetek: AL = karakter ascii kódja (kisbetű), EBX = karakter eredeti mérete (0 = kisbetű, 1 = nagybetű)
  154. push ebx ; Eltárolom EBX értékét
  155.  
  156. sub al, 97 ; Az ascii karakter kódból ABC relatív kódot csinálok
  157. movsx eax, al ; Kiterjesztem az kódot egy 32 bites számra
  158.  
  159. add eax, _Offset ; Eltolom a kódot
  160.  
  161. ; Előkészülök maradékos osztásra: 32 bites osztás EDX:EAX / OP = EAX, maradék: EDX
  162. cdq ; EAX -> EDX:EAX
  163.  
  164. mov ebx, 26
  165. idiv ebx ; 26 karakter van az angol ábécében
  166.  
  167. ; EDX-ben van a maradék, ez mondja meg, hogy az ábécében relatív, melyik betűre van szükségem
  168.  
  169. pop ebx
  170. cmp ebx, 1 ; Nagybetű volt az eredeti betű?
  171. je Label_NewUpper
  172.  
  173. Label_NewLower:
  174. mov al, 'a'
  175. jmp Label_CreateNewChar
  176.  
  177. Label_NewUpper:
  178. mov al, 'A'
  179.  
  180. Label_CreateNewChar:
  181. movsx eax, al ; Kiterjesztem az alap karatert 32 bitre, hogy tudjak vele számolni
  182.  
  183. cmp edx, 0
  184. jl Label_NegativeOffset
  185.  
  186. ; Pozitív eltolás
  187. add eax, edx ; Ascii A + eltolás -> visszakapom az ascii kódot
  188. jmp Label_StoreNewChar
  189.  
  190. Label_NegativeOffset:
  191. mov ebx, 26 ; EBX már nem kell mert megvan az alap karater (kis vagy nagybetű)
  192. add ebx, edx ; 26-hoz hozzáadom a negatív eltolást, így az ábécé végétől visszafele számolok
  193.  
  194. add eax, ebx ; Eltolom az ascii kódot az új pozitív eltolással
  195.  
  196. Label_StoreNewChar:
  197. ; Visszarakom az új karaktert a szövegbe
  198. mov edx, offset _Input
  199. add edx, ecx
  200. mov [edx], al
  201.  
  202. Label_CodeLoopEnd:
  203. ; A szöveg hosszáig megyek
  204. add ecx, 1 ; Növelem a szöveg indexet
  205. cmp ecx, _InputLength ; Megnézem, hogy a végére értem-e
  206. jl Label_CodeLoop ; Ha nem, folytatom
  207.  
  208.  
  209. Label_WriteOutput: ; Kiírja az eredményt
  210. ; Kész a kódolás
  211. mov edx, offset Str_Result
  212. call WriteString
  213.  
  214. mov edx, offset _Input
  215. call WriteString
  216.  
  217. mov edx, offset Str_Quote
  218. call WriteString
  219.  
  220. ; Újsor + kilépés szöveg
  221. mov edx, offset Str_ExitTxt
  222. call WriteString
  223.  
  224. ; Várok egy karakter nyomást
  225. call ReadChar
  226.  
  227. invoke ExitProcess,0
  228. main endp
  229. end main
Add Comment
Please, Sign In to add comment