vuoi
o PayPal
tutte le volte che vuoi
Saved: 24/10/12 07:07:07 PM Printed For: Simone Gilardi
# Calcolatori Elettronici 16/10/2012
1 # GILARDI SIMONE - Bioingegneria UNIPV
2 # Web: www.gilardisimone.com
3 # E-mail: s.gilardi28@gmail.com
4
5
6 # ! ! CIFRARIO DI CESARE
7
8 # Testato con il simulatore PCSpim.
9 # Inserire il testo utilizzando caratteri dell'alfabeto inglese, ammette sia caratteri Lowercase che Uppercase.
10 # Il carattere 0x20 che codifica lo "spazio" sarà riportato in uscita senza cifrarlo.
11 # Eventuali orari, sono da riportare in maniera testuale. Es: 20.30= venti e trenta.
12 # In uscita si otterra' il testo cifrato in minuscolo.
13 # La chiave è a scelta, compresa tra 1/25 per cifrare, -1/-25 per decifrare.
14
15 .data! 0x10010000
16 Intro:! ! .asciiz "\t\t\tCIFRARIO DI CESARE"
17 Testo:! ! .asciiz "\n\nTesto da cifrare/decifrare: "
18 Chiave:!! .asciiz "\nChiave numerica: "
19 Risposta:! .asciiz "\nTesto cifrato: "
20 Richiesta:! .asciiz "\n\nDesidera cifrare un'altra frase? (S/N): "
21 Errore:!! .asciiz "\n\n**** ERRORE [04] ****\nRispondere con il carattere (S)si oppure (N)no."
22 Chiave_nulla: ! .asciiz "\n**** ERRORE [03] ****\nLa chiave inserita e' nulla, oppure\ne' stato inserito un carattere non valido.\n"
23 Saluti:!! .asciiz "\n\nProgramma terminato. Arrivederci!"
24 Text_nullo_msg:!.asciiz "\n**** ERRORE [01] ****\nNon e' stato inserito nessun carattere.\n"
25 Chiave_grande:! .asciiz "\n**** ERRORE [05] ****\nLa chiave inserita non e' valida. Il range corretto e':\n(1/25) per cifrare,\n(-25/-1) p
26 Errore_testo:! .asciiz "\n**** ERRORE [02] ****\nNel testo inserito, e' presente il seguente\ncarattere non valido: "
27
28 .data! 0x10017000
29 Stringa:! .space 100! ! # Spazio riservato al testo da cifrare.
30 Continua:! .space 1! ! # Spazio per S/N.
31 Char_invalid:! .space 1! # Spazio per memorizzare i caratteri inseriti, non validi.
32
33 .data! 0x10020000
34 Testo_elab: ! .space 100
35
36 .text! 0x400000
37 .globl! __start
38
39 __start:! la! $t0, 0x7ffff95c!
40 ! ! add!$sp, $zero, $t0!! # Inizializzo lo stack pointer.
41 ! ! addi! $sp, $sp, -24! # Creo spazio nello stack per salvare il contenuto dei registri.
42 ! ! sw! $ra, 0($sp)
43 ! ! sw! $s4, 4($sp)
44
/Users/simonegilardi/Dropbox/Universita' degli studi di Pavia -…ici/Assembler MIPS 32 bit/Codice di Cesare/Codice_di_Cesare.asm Page 2 of 6
Saved: 24/10/12 07:07:07 PM Printed For: Simone Gilardi
! ! sw! $s2, 8($sp)
45 ! ! sw! $s5, 12($sp)
46 ! ! sw! $s6, 16($sp)
47 ! ! sw! $s7, 20($sp)
48
49 ! ! ### PARAMETRI
50 ! ! li !$s4, 100! ! # Numero massimo di byte in lettura/elaborazione.
51 ! ! li !$s2, 0xa! ! # Carico il codice di "line feed" in $s2.
52 ! ! li! $s5, 0x20! ! # Carico il codice dello "spazio" in $s5.
53 ! ! li! $s6, 0x7b! ! # Carattere dopo la "z".
54 ! ! li! $s7, 0x61! ! # Carattere prima della "a".
55 ! ! ###
56
57 ! ! li !$v0, 4! ! ! # Codice chiamata print string.
58 ! ! la !$a0, Intro! ! # Copio il primo indirizzo della stringa, in $a0.
59 ! ! syscall
60
61 Inizio:!! la !$a0, Testo_elab!# Copio il primo indirizzo della stringa, in $a0.
62 ! ! jal ! Azzera! ! ! # Azzero la stringa tramite la subroutine "Azzera".
63 Chiedi_text:! li !$v0, 4! ! # Codice chiamata print string.
64 ! ! la !$a0, Testo! ! ! # Copio il primo indirizzo della stringa, in $a0.
65 ! ! syscall!! ! ! ! # Stampa stringa.
66 ! ! la !$a0, Stringa! ! # In $a0,indirizzo della stringa.
67 ! ! add ! $a1, $zero, $s4!# Lunghezza massima della stringa.
68 ! ! li !$v0, 8! ! ! ! # Codice read_string.
69 ! ! syscall!! ! ! ! # Legge stringa.
70 ! ! jal!Check_string! ! # Controlla se ci sono caratteri non validi nella stringa letta.
71 ! ! addi! $v1, $v1, -1! # Toglie 1 a $v1.
72 ! ! beq!$v1, $zero, Chiedi_text!# Se $v1 era ad 1, chiedi ancora il testo.
73 ! ! lb !$t0, 0($a0)
74 ! ! beq ! $s2, $t0, Testo_nullo
75 Key:! ! li !$v0, 4! ! ! # Codice chiamata print_string.
76 ! ! la !$a0, Chiave
77 ! ! syscall!! ! ! ! # Stampa stringa.
78 ! ! li !$v0, 5! ! ! ! # Leggi intero (chiave).
79 ! ! syscall
80 ! ! beqz ! $v0, Err_chiave!! # se $v0=0, salta all'indirizzo puntato dall'etichetta "Err_chiave".
81 ! ! slti! $t0, $v0, 26! ! # $t0=1 se è minore di 26, 0 se è più grande.
82 ! ! beqz! $t0, Err_key_big! # Salta se $t0=0.
83 ! ! slti! $t0, $v0, -25! ! # $t0=1 se è minore di -25, 0 se è più grande.
84 ! ! bne!$t0, $zero, Err_key_big!# Se $t0 è diverse da 0, error.
85 ! ! add ! $s1, $v0, $zero!! # Salvo la chiave letta, in $s1.
86 ! ! la !$t1, Stringa! ! # Indirizzo del primo elemento della stringa letta, in $t1.
87 ! ! move ! $s0, $zero! ! # Azzero il puntatore $s0. Pseudoistruzione.
88
/Users/simonegilardi/Dropbox/Universita' degli studi di Pavia -…ici/Assembler MIPS 32 bit/Codice di Cesare/Codice_di_Cesare.asm Page 3 of 6
Saved: 24/10/12 07:07:07 PM Printed For: Simone Gilardi
! ! la !$t6, Testo_elab!! # Carico il primo indirizzo di memoria puntato dall'etichetta "Testo_elab", in $t6.
89 Cripta:!! add ! $t2, $t1, $s0! # Indirizzo i-esimo della stringa, in $t2.
90 ! ! lb! $t3, 0($t2)!! # Byte -> in $t3.
91 ! ! beq ! $t3, $s2, Esci! ! # Se $t3=$s2, salta all'indirizzo puntato dall'etichetta "Esci".
92 ! ! add ! $t7, $t6, $s0! ! # $t7=$t6+$s0 ovvero, aggiorno il puntatore all'elemento della stringa elaborata.
93 ! ! addi ! $s0, $s0, 1!! ! # Incremento il puntatore.
94 ! ! beq!$t3, $s5, Spazio! # Se il carattere letto e' lo spazio, lo scrive direttamente senza applicare la chiave.
95 ! ! ori!$t3, $t3, 0x20! ! # Se è Uppercase, torna Lowercase. Se è Lowercase, non subisce variazioni con la ORI 0x20.
96 K1:!! add ! $t4, $t3, $s1! # Byte letto + chiave, in $t4.
97 ! ! slt!$t0, $t4, $s6! ! # $s6=0x7b è il carattere dopo la z nella tabella ascii.
98 ! ! beqz! $t0, Sottrai_dim! # Se $t0=0 Sottrai_dim
99 ! ! slt!$t0, $t4, $s7! ! # $s7=0x61 è il carattere prima di a nella tabella ascii.
100 ! ! bne!$t0, $zero, Somma_dim! # Se $t0 diverso da 0, Somma_dim.
101 Back:! ! sb !$t4, 0($t7)!! # Scrivo il byte crittografato, in memoria.
102 ! ! j ! Cripta! ! ! ! # Salto all'indirizzo puntato dall'etichetta "Cripta".
103
104 Sottrai_dim:! addi! $t4, $t4, -26
105 ! ! j! Back
106
107 Somma_dim:! addi! $t4, $t4, 26
108 ! ! j! Back
109
110 Spazio:!! sb! $t3, 0($t7)
111 ! ! j! Cripta
112
113 Esci:! ! li !$v0, 4
114 ! ! la !$a0, Risposta
115 ! ! syscall
116 ! ! #li ! $v0, 4! ! ! ! # $v0 è già a 4 dal punto precedente.
117 ! ! la !$a0, Testo_elab
118 ! ! syscall
119 ! ! #li ! $v0, 4! ! ! ! # $v0 è già a 4 dal punto precedente.
120 Chiedi:!! la !$a0, Richiesta
121 ! ! syscall
122 ! ! la !$a0, Continua! ! ! # In $a0,indirizzo della stringa.
123 ! ! la !$a1, 2! ! ! ! ! # Lunghezza massima della stringa.
124 ! ! li !$v0, 8! ! ! ! ! # Codice read_string.
125 ! ! syscall
126 ! ! lb !$t0, 0($a0)!! ! ! # Carico il carattere letto in $t0.
127 ! ! beq ! $t0, 0x53, Inizio! # Se il byte in $t0 e'=S in ascii, salta a Inizio.
128 ! ! beq ! $t0, 0x73, Inizio! # Se il byte in $t0 e'=s in ascii, salta a Inizio.
129 ! ! beq ! $t0, 0x6e, Stop!! # Stessa cosa per N/n, salta a Stop.
130 ! ! beq ! $t0, 0x4e, Stop
131 ! ! li !$v0, 4! ! ! ! ! # Se il byte inserito non è S/N in ascii, Errore.
132
/Users/simonegilardi/Dropbox/Universita' degli studi di Pavia -…ici/Assembler MIPS 32 bit/Codice di Cesare/Codice_di_Cesare.asm Page 4 of 6
Saved: 24/10/12 07:07:07 PM Printed For: Simone Gilardi
! ! la !$a0, Errore
133 ! ! syscall
134 ! ! j ! Chiedi
135
136 Check_string:! addi! $sp, $sp, -16! # Subroutine per il controllo di caratteri non presenti nell'alfabeto a-z.
137 ! ! sw! $a0, 12($sp)
138 ! ! sw! $t3, 8($sp)
139 ! ! sw! $t0, 4($sp)
140 ! ! sw! $t1, 0($sp)
141 P1:!! lb! $t0, 0($a0)!! ! # Carico il byte in $t0.
142 ! !
143 ! ! beq!$t0, $s2, E1! ! # Se in $t0 e' presente il carattere di linefeed 0xa, salta a E1.
144 ! ! addi! $a0, $a0, 1!! # Aggiorno il puntatore.
145 ! ! beq!$t0, $s5, P1! ! # $t0 == "spazio" 0x20? ->P1
146 ! ! slt!$t1, $t0, $s6! ! # $s6=0x7b
147 ! ! beqz! $t1, Char_not_valid
148 ! ! slt!$t1, $t0, $s7! ! # $s7=0x61
149 ! ! addi! $t1, $t1, -1
150 ! ! beq!$t1, $zero, Trasf_case
151 ! ! j! P1
152 E1:!! lw! $t1, 0($sp)!! ! # Ripristino i valori dei registri.
153 ! ! lw! $t0, 4($sp)
154 ! ! lw! $t3, 8($sp)
155 ! ! lw! $a0, 12($sp)
156 ! ! addi! $sp, $sp, 16! # Aggiorno lo sp.
157 ! ! jr! $ra!! ! ! ! # In $ra è memorizzato l'indirizzo dell'istruzione successiva
158 ! ! ! ! ! ! ! ! # a quella della chiamata alla subroutine.
159 Trasf_case:!slt!$t1, $t0, 0x5b
160 ! ! beqz! $t1, Char_not_valid
161 ! ! slt!$t1, $t0, 0x41
162 ! ! addi! $t1, $t1, -1
163 ! ! beq!$t1, $zero, Char_not_valid
164 ! ! j! P1
165
166 Char_not_valid:!li !$v0, 4
167 ! ! la !$a0, Errore_testo
168 ! ! syscall
169 ! ! la! $t1, Char_invalid
170 ! ! sb! $t0, 0($t1)
171 ! ! li !$v0, 4
172 ! ! la !$a0, Char_invalid
173 ! ! syscall
174 ! ! addi! $v1, $zero, 1! ! ! # codice 1 per segnalare che c'è un carattere non valido.
175 ! ! j! E1
176