MIPS switch/case

di il
7 risposte

MIPS switch/case

Vorrei porre una domanda riguardo questo codice

slt $t3, $s5, $zero
bne $t3, $zero, Exit
slt $t3, $s5, $t2
beq $t3, $zero, Exit
add $t1, $s5, $s5
add $t1, $t1, $t1
add $t1, $t1, $t4
lw $t0, 0($t1)
jr $t0
L0: add $s0, $s3, $s4; j Exit
L1: add $s0, $s1, $s2; j Exit
L2: sub $s0, $s1, $s2; j Exit
L3: sub $s0, $s3, $s4; j Exit
Exit: ……..

Dove f? $s0, g? $s1, h? $s2, i? $s3, j? $s4, k? $s5, 4? $t2, indirizzo tabella? $t4
che come sapete corrisponde a questo
switch(k)
case 0 f=i+j;break;
case 1 f=g+h;break;
case 2 f=g-h;break;
case 3 f=i-j;break;
La domanda è la seguente: Perchè non si può supporre che nel registro $t4 al posto di contenere l'indirizzo della tabella dei salti non contenga direttamente l'indirizzo dell'etichetta che contiene l'istruzione da eseguire?
Ciò permetterebbe di saltare un istruzione che sarebbe la seguente
lw $t0, 0($t1)
in quanto in $t1 abbiamo l'indirizzo diretto dell'etichetta. A questo punto l'istruzione che segue sarebbe cosi modificata
jr $t1
Spero di essere stato chiaro
Grazie in anticipo per le eventuali risposte.

7 Risposte

  • Re: MIPS switch/case

    Io lo switch\case lo avrei impostato così:
    
    .globl main
    .data
    
    .text
    
    main:
    	li $v0, 5
    	syscall		#Esempio leggo intero da tastiera
    	move $t0, $v0
    	
    	beqz $t0, case0
    	beq $t0, 1, case1
    	beq $t0, 2, case2
    	beq $t0, 3, case3
    	j exit
    	
    case0:	#istruzioni
    	j exit
    
    case1:	#istruzioni
    	j exit
    case2:	#istruzioni
    	j exit
    case3:	#istruzioni
    	j exit
    
    exit:
    	li $v0, 10
    	syscall
    
  • Re: MIPS switch/case

    Paolovox ha scritto:


    Io lo switch\case lo avrei impostato così:
    
    .globl main
    .data
    
    .text
    
    main:
    	li $v0, 5
    	syscall		#Esempio leggo intero da tastiera
    	move $t0, $v0
    	
    	beqz $t0, case0
    	beq $t0, 1, case1
    	beq $t0, 2, case2
    	beq $t0, 3, case3
    	j exit
    	
    case0:	#istruzioni
    	j exit
    
    case1:	#istruzioni
    	j exit
    case2:	#istruzioni
    	j exit
    case3:	#istruzioni
    	j exit
    
    exit:
    	li $v0, 10
    	syscall
    
    Il codice che ho menzionato è scritto a scopo puramente didattico , quindi con un numero limitato di istruzioni visto che ho appena iniziato lo studio di questo linguaggio. Preferirei quindi attenermi al codice scritto da me.
  • Re: MIPS switch/case

    Si peró nn riesco a capire nel tuo codice quand'é che controllo lo switch per entrare nei vari case.
  • Re: MIPS switch/case

    Paolovox ha scritto:


    Si peró nn riesco a capire nel tuo codice quand'é che controllo lo switch per entrare nei vari case.
    con l'istruzione jr salto all'indirizzo contenuto nella cella $t0 che contiene appunto l'indirizzo della cella dell'istruzione da eseguire di uno dei case
  • Re: MIPS switch/case

    Perchè non si può supporre che nel registro $t4 al posto di contenere l'indirizzo della tabella dei salti non contenga direttamente l'indirizzo dell'etichetta che contiene l'istruzione da eseguire?
    Nemmeno ho capito benissimo però a questo ti posso rispondere che un registro può contenere l'indirizzo di una label o etichetta, proprio come i puntatori in C.
    L'istruzione che lo consente è:
    
    la $REGISTRO, LABEL
    
    Quindi il $REGISTRO punterà perfettamente all'indirizzo della label e comincerà ad eseguire le sue istruzioni sequenzialmente.

    Piccolo esempio:
    
    .globl main
    .data
    .text
    stampa:	
    	li $v0, 1
    	move $a0, $t0
    	syscall
    	
    	li $v0, 10 #EXIT
    	syscall 
    main:            #ENTRY POINT
    	li $t0, 42
    	
    	la $t5, stampa
    	jr $t5
    
    Il jump register $t5, salta alla label stampa e poi esce. L'esecuzione parte dal main.
    Avrei potuto usare anche un jump normale: j $t5.
  • Re: MIPS switch/case

    Allora il miglior modo per creare una struttura switch/case
    consiste nel parametrizzare sia le opzioni da scandagliare che le label da eseguire.
    qui posto un esempio
    
    jtable: .word label1,label2,label3,label4,label5,label6,label7 #vettore delle label da eseguire
    vettore: .word0,1,2,3,4,5,6 #valori da scandagliare
    # switch /case
    move $t2,$zero #adibbito agli offset per prelevare i valori da scandagliare
    switch:
    bge $t0,7,default # default serve nel caso il valore da scandagliare non sia previsto.
    #nel caso non si conoscano il valore minimo da escludere basta fare ($t2/4) + 1 alfine di #determinare il numero degli elementi scandagliati cosi da impostare una bge sul numero degli #elementi del vettore. 
    lw $t1, vettore($t2) #carica l'elemento da scandagliare
    bqe $t0,$t1,smista #se l'elemento è stato trovato allora vai allo smistamento delle label. 
    addi $t2,$t2,4 # prossimo elemento da scandagliare
    j switch
    smista:
    sll $s0,$s0,2       # imposta l'indice del vettore delle jmptable
    la  $t0,jTable      #carica l'indirizzo della jmptable
    add $s0,$s0,$t0     #calcola l'offset che deve essere eseguito
    lw  $s0,($s0)       # carica l'indirizzo 
    jr  $s0             #esegue la label richiesta
    default: #qui metti le istruzioni che dovranno essere eseguite se la switch/case fallisce.
    
    spero che vi sia stato di aiuto
  • Re: MIPS switch/case

    Grazie a tutti per l'aiuto
Devi accedere o registrarti per scrivere nel forum
7 risposte