![Homepage](//www.dsy.it/images/logo.gif) | |
Il progetto dsy.it è l'unofficial support site dei corsi di laurea del Dipartimento di Scienze dell'Informazione e del Dipartimento di Informatica e Comunicazione della Statale di Milano. E' un servizio degli studenti per gli studenti, curato in modo no-profit da un gruppo di essi. I nostri servizi comprendono aree di discussione per ogni Corso di Laurea, un'area download per lo scambio file, una raccolta di link e un motore di ricerca, il supporto agli studenti lavoratori, il forum hosting per Professori e studenti, i blog, e molto altro...
In questa sezione è indicizzato in textonly il contenuto del nostro forum |
[SPIM] Dubbio... Clicca QUI per vedere il messaggio nel forum |
drakend |
Stavo studiando un po' lo SPIM ed ho provato a realizzare un programma che realizza il calcolo di potenze di base ed esponente interi positivi. Siccome volevo provare anche le chiamate di procedura ho usato la ricorsione anziché un ciclo, solo che incontro un piccolo problema: l'istruzione jal che uso per chiamare la procedura e salvare l'indirizzo della prossima istruzione da cui riprendere l'esecuzione non funziona... o meglio non sembra farlo correttamente. Sì perché quando chiamo jal questa mi mette dentro $ra l'indirizzo della prima istruzione della funzione chiamata, rendendomi impossibile uscire quindi dalla procedura alla fine. Volevo sapere da cosa poteva dipendere.
Ah uso il simulatore PCSpim su Windows XP.
Il codice lo riporto di seguito per completezza.
---
#Programma per il calcolo di una potenza mediante procedura ricorsiva
.data
stringa1: .asciiz "Inserire la base: "
stringa2: .asciiz "Inserire l'esponente: "
stringa3: .asciiz "Il risultato è: "
.text
#LEGGO LA BASE
la $a0,stringa1
li $v0,4
syscall
li $v0,5
syscall
move $a2,$v0
#LEGGO L'ESPONENTE
la $a0,stringa2
li $v0,4
syscall
li $v0,5
syscall
move $a3,$v0
beq $a3,0,esponentezero #in caso di base ^0 gestisco la particolarità
move $v0,$a2
add $a3,$a3,-1
jal calcola
j stampa
calcola:
beq $a3,0,fine #se l'esponente è zero termino la ricorsione
#alloco lo stack e calcolo la potenza
mul $v0,$v0,$a2
addi $a3,$a3,-1
#salvo $ra
addi $sp,$sp,-4
sw $ra,0($sp)
jal calcola
#ricarico $ra
lw $ra,0($sp)
addi $sp,$sp,4
fine:
jr $ra
esponentezero:
li $v0,1
stampa:
move $t0,$v0
la $a0,stringa3
li $v0,4
syscall
move $a0,$t0
li $v0,1
syscall |
AlphaGamma |
Prova a salvare il program counter nello stack (che punta alla prossima istruzione) al posto di $ra. Ocio che devi ricaricarlo prima di ritornare.
Insomma una cosa del genere:
prima del salto:
addi $sp, $sp, -4
addi $t0, $pc, 4
sw $t0, 0($sp)
jal calcola
prima di tornare indietro
lw $t0, 0($sp)
addi $sp, $sp, 4
jr $t0
$pc e' aumentato di 4 perche' deve saltare DOPO calcola. |
drakend |
Originally posted by AlphaGamma
Prova a salvare il program counter nello stack (che punta alla prossima istruzione) al posto di $ra. Ocio che devi ricaricarlo prima di ritornare.
Insomma una cosa del genere:
prima del salto:
addi $sp, $sp, -4
addi $t0, $pc, 4
sw $t0, 0($sp)
jal calcola
prima di tornare indietro
lw $t0, 0($sp)
addi $sp, $sp, 4
jr $t0
$pc e' aumentato di 4 perche' deve saltare DOPO calcola.
Avevo pensato anche io di manipolare direttamente il valore del program counter... il problema è che spim non mi riconosce l'identificatore $pc... ho la versione 1.0 di PC SPim, l'ho scaricata dal sito, dovrebbe essere l'ultima.
Cmq al di là dei casini legati al simulatore, tu quando sommi 4 al pc non lo fai puntare all'istruzione sw $t0, 0($sp)?
Dovresti sommargli 12 per farlo andare dopo jal continua, no? |
drakend |
Dovevo mettere .globl main dopo text...
Ho provato per caso e funziona tutto a dovere, bella cazzata! :) |
Flyzone |
Originally posted by drakend
ho la versione 1.0 di PC SPim, l'ho scaricata dal sito, dovrebbe essere l'ultima.
1.0? :shock:
"The current version of spim is 6.5 (January 2003), which contains the following changes from version 6.4
http://www.cs.wisc.edu/~larus/spim.html
:ciaoo: |
drakend |
Originally posted by Flyzone
1.0? :shock:
"The current version of spim is 6.5 (January 2003), which contains the following changes from version 6.4
http://www.cs.wisc.edu/~larus/spim.html
:ciaoo:
In realtà è PCSpim ad essere 1.0, mentre il vero e proprio simulatore è 6.5, hai ragione. Probabilmente con la dicitura PcSpim si riferisce alla sola interfaccia grafica. |
|
|
|
|