81 lines
2.9 KiB
ArmAsm
81 lines
2.9 KiB
ArmAsm
; Autor reseni: roman necas xnecasr00
|
|
|
|
; Projekt 2 - INP 2024
|
|
; Vigenerova sifra na architekture MIPS64
|
|
|
|
; DATA SEGMENT
|
|
.data
|
|
msg: .asciiz "romannecas" ; sem doplnte vase "jmenoprijmeni"
|
|
cipher: .space 31 ; misto pro zapis zasifrovaneho textu
|
|
; zde si muzete nadefinovat vlastni promenne ci konstanty,
|
|
; napr. hodnoty posuvu pro jednotlive znaky sifrovacho klice
|
|
|
|
key: .asciiz "nec"
|
|
|
|
params_sys5: .space 8 ; misto pro ulozeni adresy pocatku
|
|
; retezce pro vypis pomoci syscall 5
|
|
; (viz nize "funkce" print_string)
|
|
|
|
; CODE SEGMENT
|
|
.text
|
|
|
|
main: ; ZDE NAHRATE KOD VASIM RESENIM
|
|
daddi r4, r0, msg ;nacitanie msg do r4
|
|
daddi r5, r0, cipher ;nacitanie adr. cipher do r5
|
|
daddi r6, r0, key ;adr. kluca do r6
|
|
daddi r7, r0, 1 ;init priz. smeru(1 vpred, -1 vzad)
|
|
encrpt_loop:
|
|
lb r8, 0(r4) ;nacitanie znaku z msg
|
|
beqz r8, end_encrpt ; ak 0, tak konec siforvania
|
|
|
|
lb r9, 0(r6) ;nacitanie znaku z key
|
|
beqz r9, reset_key ;ak 0, reset an zacaitok key
|
|
j continue_encrpt
|
|
reset_key:
|
|
daddi r6, r0, key ;reset adresy kluca na zaciatok
|
|
lb r9, 0(r6) ;nacitanie prveho kluca
|
|
continue_encrpt:
|
|
daddi r9, r9, -96 ; prevod znaku kluce na cislo (a=0, b=1, ...)
|
|
mult r9, r7 ; smeru posuvu
|
|
mflo r9 ; ziskani vysledku nasobeni
|
|
dadd r10, r8, r9 ; posuvu na znak zpravy
|
|
|
|
slti r11, r10, 97 ; kontrola, ci je vysledek mensi nez 'a'
|
|
bnez r11, wrap_forward
|
|
|
|
slti r11, r10, 123 ; kontrola, ci je vysl. vetsi nez 'z'
|
|
beqz r11, wrap_backward
|
|
|
|
j store_char
|
|
|
|
wrap_forward:
|
|
daddi r10, r10, 26 ; wrap zpet do rozsahu
|
|
j store_char
|
|
|
|
wrap_backward:
|
|
daddi r10, r10, -26 ; wrap zpet do rozsahu
|
|
|
|
store_char:
|
|
sb r10, 0(r5) ; ulozeni zasifrovaneho znaku
|
|
|
|
daddi r4, r4, 1 ; posun na dalsi znak zpravy
|
|
daddi r5, r5, 1 ; posun na dalsiu poziciu v encrpt zprave
|
|
daddi r6, r6, 1 ; posun na dalsi znak kluca
|
|
dsub r7, r0, r7 ; zmena smeru z 1 na -1 nebo z -1 na 1
|
|
j encrpt_loop
|
|
|
|
end_encrpt:
|
|
sb r0, 0(r5) ;ukonc, 0 do cipher
|
|
daddi r4, r0, cipher ;priprava pre vypis encprt
|
|
jal print_string ;vypis encrpt textu
|
|
|
|
|
|
; NASLEDUJICI KOD NEMODIFIKUJTE!
|
|
|
|
syscall 0 ; halt
|
|
|
|
print_string: ; adresa retezce se ocekava v r4
|
|
sw r4, params_sys5(r0)
|
|
daddi r14, r0, params_sys5 ; adr pro syscall 5 musi do r14
|
|
syscall 5 ; systemova procedura - vypis retezce na terminal
|
|
jr r31 ; return - r31 je urcen na return address
|