Anteprima
Vedrai una selezione di 3 pagine su 6
Calcolatori elettronici - codice di Cesare in Assembler MIPS 32bit Pag. 1 Calcolatori elettronici - codice di Cesare in Assembler MIPS 32bit Pag. 2
Anteprima di 3 pagg. su 6.
Scarica il documento per vederlo tutto.
Calcolatori elettronici - codice di Cesare in Assembler MIPS 32bit Pag. 6
1 su 6
D/illustrazione/soddisfatti o rimborsati
Disdici quando
vuoi
Acquista con carta
o PayPal
Scarica i documenti
tutte le volte che vuoi
Estratto del documento

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

Dettagli
Publisher
A.A. 2012-2013
6 pagine
2 download
SSD Ingegneria industriale e dell'informazione ING-INF/05 Sistemi di elaborazione delle informazioni

I contenuti di questa pagina costituiscono rielaborazioni personali del Publisher shiva28 di informazioni apprese con la frequenza delle lezioni di Calcolatori elettronici e studio autonomo di eventuali libri di riferimento in preparazione dell'esame finale o della tesi. Non devono intendersi come materiale ufficiale dell'università Università degli Studi di Pavia o del prof Danese Giovanni.