Jump Address Table Assembly MIPS

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
elrod
Prode Principiante
Messaggi: 41
Iscrizione: lunedì 8 giugno 2009, 16:47
Desktop: Unity
Distribuzione: Ubuntu 13.04 64bit
Contatti:

Jump Address Table Assembly MIPS

Messaggio da elrod »

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.
Millerx86
Prode Principiante
Messaggi: 69
Iscrizione: mercoledì 8 febbraio 2017, 23:38
Sesso: Maschile

Re: Jump Address Table Assembly MIPS

Messaggio da Millerx86 »

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 :)
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 3 ospiti