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 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