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

stack pointer e frame pointer...xkè?? help!


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

#1
irving

irving

    Advanced Member

  • Utente
  • StellaStellaStella
  • 184 Messaggi:
salve ragà...facendo degli esercizi non ho capito bene l'uso dello stack pointer anzi, direi più quello sul frame pointer.
lo stack viene usato quando i paramentri si gestiscono direttamente tramite la memoria giusto? spero di si.
inoltre, chi mi sa dire xkè e quando si usa il frame pointer??

ora posto dei pezzi di codice, con relative soluzioni che ho già svolte...mi sapreste dire il xkè? :mirror:


# void carica_mat(int m[][10], int *r, int *c)
# {
# int i, k;
# printf("Inserisci il numero di righe");
# scanf("%d",r);
# printf("Inserisci il numero di colonne");
# scanf("%d",c);
# printf("Inserisci la matrice\n");
# for(i=0;i <*r;i++)
# for(k=0;k<*c;k+++)
# scanf("%d",&m[i][j]);
# }

N.B: per la funzione carica_mat lo scambio dei parametri con il programma chiamante avvenga attraverso lo stack;

carica_mat:
addi $sp, $sp, -16
sw $s0, 0 ($sp)
sw $s1, 4 ($sp)
sw $s2, 8 ($sp)
sw $fp, 12 ($sp)

addi $fp, $sp, 16
lw $s0, 0($fp) #&m[10][10]=s0
lw $s1, 4($fp) #&r=s1
lw $s2, 8($fp) #&c=s2
xkè usiamo il fp?
inoltre xke nelle funzioni usiamo sempre:

addi $sp, $sp, -n
sw $s0, 0 ($sp)
sw $s1, 4 ($sp)
sw $s2, 8 ($sp)
....
sw $s5, n-1 ($sp) ?
come faccio a capire quanti registri usare? dovrei metttere tanti registri quanti sono i miei paramentri o quante sono le mie variabili + i paramentri?

su quest altra funzione ckè si usa sempre lo stack quando poi nn è richiesto dalla traccia?:

# void INVERTI (char str[])
# {
# int i, len;
# for(i=0; str[i]!='\0'; i++)
# len++;
# for(i=0; i # {
# scambia(str[i], str[len-i-1]);
# }
# }

N.B= per la funz "inverti" lo scambio dei parametri con il programma chiamante avvenga attraverso i registri in modo che l'indirizzo base della stringa str sia associato a $a;

inverti:
addi $sp, $sp, -20
sw $ra, 0($sp)
sw $s0, 4($sp)
sw $s1, 8($sp)
sw $s2, 12($sp)
sw $s3, 16($sp)
add $s0, $a0, $0
xkè usiamo i registri fino a S3? e xke si usa lo stack?
guardando altri esercizi, noto che l'inizio del programma viene effettuato sempre ttramite lo stack..xkè? :rosso: :badmood:

inoltre il registro "ra" xke viene usato? xke c'è una chiamata a funzione all interno della funz? o viene usato sempre quando usiamo lo stak o xkè abbiamo una procedura? scusatemi se sto dicendo sciokkezze, ma non c'ho capito tnt bene :scratch:

spero che qualcuno mi risolva il probl, facendomi capire un po... lunedi c'è l'esame :oops: :viaaa: :notworthy: :ciao:



#2
r00t

r00t

    Advanced Member

  • Utente
  • StellaStellaStella
  • 850 Messaggi:
Per quanto riguarda lo stack lo utilizziamo nel caso in cui venga richiesto dalla traccia per non perdere i valori nei registri della funzione chiamante.. infatti salvandoli in memoria tramite lo sp puoi riutilizzare quei registri s0, s1 etc nella funzione chiamata.. una volta che la funzione chiamata termina il proprio lavoro ti ricarichi nei registri s0, s1 etc i vecchi valori della funzione chiamante... il registro ra si salva nel momento in cui stai chiamando una funzione che non è foglia, e che quindi effettuerà un'altra istruzione jal che salverà nel registro ra l'indirizzo della prossima istruzione(rispetto alla jal) sovrscrivendo così la prossima istruzione (rispetto al jal) del chiamante iniziale... per quanto riguarda il fp ce ne parlarono l'ultimo giorno di corso.. da quello che ho capito io può essere utilizzato come lo sp a differenza che il fp punta sempre l'indirizzo della prima locazione di memoria del record di attivazione.. altro non so :(

#3
DomenicoAngri

DomenicoAngri

    Advanced Member

  • Utente
  • StellaStellaStella
  • 198 Messaggi:
Si ha ragione r00t, in effetti è proprio una differenza.

Il vero e proprio uso del frame pointer è quello di riuscire a tenere traccia di molte informazioni senza perderle.

Anzitutto, non è doveroso usarlo, quindi se vuoi evitare impicci ( a meno che il prof. non lo richieda esplicitamente, ma non l'ho ha mai fatto ) non usarlo.

In pratica: immagina il record di attivazione riservato alla tua procedura. Dal basso (dall'ultima cella di memoria) parte il puntatore dello SP e dall'alto (dalla prima di memoria) quello del FP. Ora lo si può usare come un vero e proprio secondo stake pointer, ovvero come una secondo puntatore di supporto allo SP.
Ti spiego:
Se tu hai 100 vettori ognuno da 100mila elementi diventa alquanto difficile ricordare gli indirizzi e le locazioni di memoria che ti servono. Allora tu, con lo stake pointer allochi tutti gli indirizzi di memoria e poi con il FP ti scorri i vettori ad esempio. Da quanto hai potuto capire, a noi, nel nostro esame, non serve assolutamente, perchè i parametri che passiamo alle procedure sono pochi e sopratutto piccoli. Quindi meglio evitare giramenti di testa, non usarlo!

Per differenza si intende proprio il fatto che per trovare più facilmente le informazioni si calcola l'offset fra lo SP e il FP però non ricordo precisamente come...




Leggono questa discussione 0 utenti

0 utenti, 0 ospiti, 0 utenti anonimi