Jump Address Table Assembly MIPS

Linguaggi di programmazione: php, perl, python, C, bash, ecc.

Jump Address Table Assembly MIPS

Messaggioda elrod » mercoledì 24 giugno 2009, 19:07

ciao a tutti, altro problema...

stavo cercando di capire come funzionava la jump address table per ricreare il costrutto switch in assembly MIPS, io ho scirtto questo esempio:
Codice: Seleziona tutto
.data
in_str:   .asciiz"Inserire un intero> "
str_1:   .asciiz"JAT 1"
str_2:   .asciiz"JAT 2"
str_3:   .asciiz"JAT 3"
str_4:   .asciiz"JAT 4"
str_5:   .asciiz"JAT 5"
str_6:   .asciiz"JAT 6"
str_7:   .asciiz"JAT 7"
allocazione:   .space 28
.text
.globl main   

main:   la $a0, in_str      #Carico stringa
   li $v0, 4      #Stampo stringa
   syscall
   li $v0, 5      #Input utente
   syscall
   move $s0, $v0      #Salvo input in registro $s0

   #Verifico condizione 1<=N<=7
   ori $t0, $0, 0x1   #Carico la costante 1 in $t0
   slt $t0, $s0, $t0   #Setto $t0 a 1 se $s0 è minore di 1
   bne $t0, $0, exit   #Se $t0 non è 0 esco
   ori $t0, $0, 0x7   #Carico la costante 7 in $t0
   sgt $t0, $s0, $t0   #Setto $t0 a 1 se $s0 è maggiore di 7
   bne $t0, $0, exit   #Se $t0 non è 0 esco

   #Alloco procedure nella JAT
   la $s1, allocazione   #Carico base address
   la $t1, L01      #Carico procedura L01
   sw $t1, 0($s1)      #Salvo procedura nella JAT
   la $t1, L02      #Carico procedura L02
   sw $t1, 4($s1)      #Salvo procedura nella JAT
   la $t1, L03      #Carico procedura L03
   sw $t1, 8($s1)      #Salvo procedura nella JAT
   la $t1, L04      #Carico procedura L04
   sw $t1, 12($s1)      #Salvo procedura nella JAT
   la $t1, L05      #Carico procedura L05
   sw $t1, 16($s1)      #Salvo procedura nella JAT
   la $t1, L06      #Carico procedura L06
   sw $t1, 20($s1)      #Salvo procedura nella JAT
   la $t1, L07      #Carico procedura L07
   sw $t1, 24($s1)      #Salvo procedura nella JAT
   
   #Casi
   sll $t0, $s0, 2    #Calcolo offset = input*4
   add $t0, $t0, $s1   #Calcolo base+offset
   lw $t0, 0($t0)      #Carico l'indirizzo di salto
   jr $t0         #Salta all'indirizzo contenuto in $t0

   #Jump Address Table
L01:   la $a0, str_1      #Carico stringa
   li $v0, 4      #Stampo stringa
   syscall
   j exit
L02:   la $a0, str_2      #Carico stringa
   li $v0, 4      #Stampo stringa
   syscall
   j exit
L03:   la $a0, str_3      #Carico stringa
   li $v0, 4      #Stampo stringa
   syscall
   j exit
L04:   la $a0, str_4      #Carico stringa
   li $v0, 4      #Stampo stringa
   syscall
   j exit
L05:   la $a0, str_5      #Carico stringa
   li $v0, 4      #Stampo stringa
   syscall
   j exit
L06:   la $a0, str_6      #Carico stringa
   li $v0, 4      #Stampo stringa
   syscall
   j exit
L07:   la $a0, str_7      #Carico stringa
   li $v0, 4      #Stampo stringa
   syscall
   j exit

exit:   li $v0, 10
   syscall


Ho provato ad eseguirlo sul simulatore spim, e si comporta correttamente per input minori di 1 e maggiori di 7, ma quando l'input è compreso tra 1 e 7 come richiesto, non calcola correttamente l'indirizzo di salto, e mi spara in output una sfilza chilometrica di eccezioni...

ho intuito che molto probabilmente sbaglio qualcosa nel calcolo dell'indirizzo di salto, ma cosa ???
grazie ancora per l'aiuto...
ciao

EDIT: se può essere d'aiuto l'eccezione è:
Codice: Seleziona tutto
Exception occurred at PC=0x340273fc
  Bad address in text read: 0x340273fc
  Exception 6  [Bad instruction address]  occurred and ignored

all'infinito, cioè continua a stamparmi quest'eccezione incrementando di volta in volta il PC
Ultima modifica di elrod il giovedì 25 giugno 2009, 16:21, modificato 1 volta in totale.
elrod
Prode Principiante
 
Messaggi: 41
Iscrizione: giugno 2009
Desktop: Unity
Distribuzione: Ubuntu 13.04 64bit

Re: Jump Address Table Assembly MIPS

Messaggioda Millerx86 » domenica 14 maggio 2017, 21:59

Ciao credo che ormai avrai trovato la soluzione, ma rispondo comunque per aiutare la comunità, l'errore che hai fatto è che non hai allineato il segmento dati, devi mettere un
Codice: Seleziona tutto
.align 2
dopo l'ultima stringa prima di allocare lo spazio di memoria :)
Millerx86
Prode Principiante
 
Messaggi: 27
Iscrizione: febbraio 2017
Sesso: Maschile


Torna a Programmazione

Chi c’è in linea

Visualizzano questa sezione: John_Marco e 3 ospiti