This repository has been archived by the owner on Jan 12, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathvernam.s
63 lines (54 loc) · 3.21 KB
/
vernam.s
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
; Autor reseni: Onegen (xkrame00)
; Projekt 2 - INP 2022
; Vernamova sifra na architekture MIPS64
.data
login: .asciiz "xkrame00" ; login
cipher: .space 17 ; miesto pre sifrovany login
params_sys5: .space 8 ; miesto pre adresu pociatku retazca
.text
main: ADDU R20, R0, R0 ; R20 = index v retazci (pocitadlo)
encryptLoop: ; Ulozenie znaku na aktualnom indexe
LB R10, login(R20) ; R10 = ASCII znak na aktualnej pozicii
; Ak znak nie je male pismeno (ASCII 97-122), cyklus konci
SLTI R1, R10, 96 ; R1 = 1 ak je ASCII znak < 96, inak R1 = 0
BNE R1, R0, encryptEnd
SLTI R1, R10, 123 ; R1 = 1 ak je ASCII znak < 123, inak R1 = 0
BEQ R1, R0, encryptEnd
; Ziskanie hodnoty kluca pre aktualny index a zasifrovanie znaku
ANDI R1, R20, 1 ; R1 = 0 ak je index parny, inak R1 = 1
BNE R1, R0, keyIfOdd
; Parny index - kluc je 'o' (ASCII 111), posun dopredu (+)
ADDI R4, R0, 111
ADDI R4, R4, -96 ; R4 = hodnota kluca
B keyIfEnd
keyIfOdd: ; Neparny index - kluc je 'n' (ASCII 110), posun dozadu (-)
ADDI R4, R0, 110
ADDI R4, R4, -96
SUB R4, R0, R4 ; R4 = hodnota kluca
keyIfEnd: ; Zasifrovanie znaku
ADD R10, R10, R4 ; R10 = ASCII znak sifrovaneho znaku
; Kontrola rozsahu malych pismen (1-26)
; Znak je mensi ako 'a'
SLTI R4, R10, 97 ; R4 = 0 ak je znak mensi ako 'a', inak R1 = 1
BEQ R4, R0, noUnderflow
ADDI R10, R10, 26 ; Underflow correction
B noOverflow
noUnderflow: ; Znak je vacsi ako 'z'
SLTI R4, R10, 123 ; R4 = 0 ak je znak vacsi ako 'z', inak R1 = 1
BNE R4, R0, noOverflow
ADDI R10, R10, -26 ; Overflow correction
noOverflow: ; Koniec kontroly rozsahu
; Vlozenie sifrovaneho znaku do vystupneho retazca
SB R10, cipher(R20) ; vlozenie sifrovaneho znaku do vystupneho retazca
; Pokracovanie cyklu
ADDI R20, R20, 1 ; R20 = index++
B encryptLoop
encryptEnd: ; Vypis vystupneho retazca
DADDI R4, R0, cipher
JAL print_string
SYSCALL 0
print_string:
SW R4, params_sys5(R0)
DADDI R14, R0, params_sys5
SYSCALL 5
JR R31