Projects/2BIT/winter-semester/INP2/xnecasr00.s
2026-04-14 19:28:46 +02:00

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