Vai al contenuto

Primario: Sky Slate Blackcurrant Watermelon Strawberry Orange Banana Apple Emerald Chocolate Marble
Secondario: Sky Slate Blackcurrant Watermelon Strawberry Orange Banana Apple Emerald Chocolate Marble
Sfondo: Blank Waves Squares Notes Sharp Wood Rockface Leather Honey Vertical Triangles
Corsi di Laurea










ROX @ Unisa - Forum degli studenti di Ingegneria utilizza i cookie. Se prosegui la navigazione accetti il loro uso.    Accetto l'uso dei cookie
-->
Foto

Uso del registro fp e direttiva .space


  • Effettua l'accesso per rispondere
Questa discussione ha avuto 11 risposta/e

#1
Fabrix883

Fabrix883

    Advanced Member

  • Utente
  • StellaStellaStella
  • 94 Messaggi:
Qualcuno potrebbe spiegarmi l'uso del registro fp (frame pointer) nelle chimate a procedure.
Inoltre nell'ultimo compito per allocare v_glob[20] si utilizza .space per allocare gli 80 byte
vett: .space 80
ma se ci fosse stata anche una dichiarazione di un'altra variabile globale, come dovrei comportarmi?
int vett[20];
int tmp;
...
main()
...
Spero che qualcuno mi possa aiutare :beg:


Perché la vita non ha senso... se non la racconti a qualcuno
Se ti ci metti con impegno, raggiungi qualsiasi risultato.[Emmett "Doc" Brown]

#2
Mr_fox

Mr_fox

    Newbie

  • Utente
  • StellaStellaStella
  • 680 Messaggi:
Il fraim pointer serve per conservare l'indirizzo della base...

Penso che per l'allocazione di un'altra variabile globale c'è bisogno di un nuovo punto space per
la nuova variabile

Es

int V_globl[20]
int x

vett: .space 80
a: .space 4
ciò che resta è la netta consapevolezza di non poter cambiare la vita... (luigi pirandello)

#3
Fabrix883

Fabrix883

    Advanced Member

  • Utente
  • StellaStellaStella
  • 94 Messaggi:
grazie, ho capito la direttiva .space
però, riferendoti al frame pointer, cosa intendi per indirizzo della base?
Perché la vita non ha senso... se non la racconti a qualcuno
Se ti ci metti con impegno, raggiungi qualsiasi risultato.[Emmett "Doc" Brown]

#4
GiX

GiX

    Advanced Member

  • Utente
  • StellaStellaStella
  • 108 Messaggi:
[edit]

Indirizzo della base nel senso che punta all'ultima word che è stata inserita nello stack, quindi, visto che i nostri stack crescono dal basso verso l'alto, punta alla base dello stack.

Prima credo di aver scritto una colossale boiata Oo

#5
Mr_fox

Mr_fox

    Newbie

  • Utente
  • StellaStellaStella
  • 680 Messaggi:
fabri ecco ti ho fatto un esempio sulle variabili globali

File allegato


ciò che resta è la netta consapevolezza di non poter cambiare la vita... (luigi pirandello)

#6
Fabrix883

Fabrix883

    Advanced Member

  • Utente
  • StellaStellaStella
  • 94 Messaggi:
Grazie Mr_fox per l'esercizio e per le spiegazioni date; se mi risolrvi anche l'ultimo mio dubbio sarebbe l'ideale :lol2:
...
int InizializzaVettore(int v[]);
....
__start:
main:
# PROLOGO
addi $sp, $sp, -52
sw $fp, 52($sp)
sw $ra, 48($sp)
sw $s0, 44($sp)
addi $fp, $sp, 52


addi $a0, $fp, -48
jal InizializzaVettore
add $s0, $v0, $0
dato che in $a0$ và messo il parametro della procedura, che in questo caso è l'indirizzo della prima cella del vettore, come mai si aggiunge -48, invece di -52? :huh:
Perché la vita non ha senso... se non la racconti a qualcuno
Se ti ci metti con impegno, raggiungi qualsiasi risultato.[Emmett "Doc" Brown]

#7
aRbok

aRbok

    Advanced Member

  • Utente
  • StellaStellaStella
  • 1517 Messaggi:
te lo spiego io il perchè: il registro $sp è lo stack pointer,cioè è il puntatore della prima cella di memoria libera nell'area di memoria stack. Se facessi addi $fp,$fp,-52 andresti a finire proprio in questa cella libera di memoria mentre lo starting address del vettore si trova nell'indirizzo immediatamente successivo a questo. Percìò (considerando che la memoria del MIPS è indirizzabile in byte e l'intero occupa 4 byte) bisogna prendere l'indirizzo "successivo" cioè sp+4 o meglio,in questo caso, fp-48.
Fai ciò che vuoi : sarà tutta la Legge. Amore è la Legge, Amore sotto la Volontà.

#8
Mr_fox

Mr_fox

    Newbie

  • Utente
  • StellaStellaStella
  • 680 Messaggi:
te lo spiego subito..
"
__start:
main:
# PROLOGO
addi $sp, $sp, -52
sw $fp, 52($sp)
sw $ra, 48($sp)
sw $s0, 44($sp)
addi $fp, $sp, 52


addi $a0, $fp, -48
jal InizializzaVettore
add $s0, $v0, $0

"
Tu quando fai il passaggio dei parametri solitamente fai :

addi $a0,$SP,4 ovvero fai -52 + 4 = -48

mentre li fai
perchè ti ricordo che in $fp hai fatto $sp +52 ovvero :
$fp=0

addi $a0,$fp,-48 ovvero fai 0 + (-48) = -48

ovvero la stessa cosa....
ciò che resta è la netta consapevolezza di non poter cambiare la vita... (luigi pirandello)

#9
Fabrix883

Fabrix883

    Advanced Member

  • Utente
  • StellaStellaStella
  • 94 Messaggi:
ok, chiaro... quindi questo vale ogni volta che dobbiamo salvare i valori di un vettore, o qualsiasi altra variabile, nello stack giusto?
Perché la vita non ha senso... se non la racconti a qualcuno
Se ti ci metti con impegno, raggiungi qualsiasi risultato.[Emmett "Doc" Brown]

#10
Peppeweb

Peppeweb

    Advanced Member

  • Utente
  • StellaStellaStella
  • 1096 Messaggi:

grazie, ho capito la direttiva .space
però, riferendoti al frame pointer, cosa intendi per indirizzo della base?

Ti consiglio di fare una capatina da pergen per farti spiegare l'argomento perchè è una cosa collegata soprattuto con quelle poche cose teoriche
...Per aspera sic itur ad astra...
Galaxy S4
iPhone5S

#11
nobody

nobody

    Advanced Member

  • Utente
  • StellaStellaStella
  • 62 Messaggi:
ragazzi ma io con la direttiva space alloco lo spazio della variabile da utilizzare ma come lo utilizzo,cioè come ne ricavo l'indirizzo..grazie

e perchè emilio scrive
a: .word 5 a cosa serve ciao :doofy:

#12
Peppeweb

Peppeweb

    Advanced Member

  • Utente
  • StellaStellaStella
  • 1096 Messaggi:

ragazzi ma io con la direttiva space alloco lo spazio della variabile da utilizzare ma come lo utilizzo,cioè come ne ricavo l'indirizzo..grazie

e perchè emilio scrive
a: .word 5 a cosa serve ciao :doofy:


Bhe mettere 5 con word non ha senso perchè viola il vincolo di allineamento di 4 byte per word.
Cmq per utilizzare poi un'area indirizzata tramite etichetta puoi fare la load address da etichetta a regisitro o tramite indirizzamento base register
...Per aspera sic itur ad astra...
Galaxy S4
iPhone5S




Leggono questa discussione 1 utenti

0 utenti, 1 ospiti, 0 utenti anonimi