Domande teoriche varie assembler Mips.

di il
4 risposte

Domande teoriche varie assembler Mips.

Ciao a tutti, mi faccio alcune domande teoriche a cui non riesco a trovare una soluzione completa.
Scrivo qui perchè magari qualcuno ne sa più di me e può chiarirmi alcuni passaggi.

La prima domanda riguarda l'uso dei registri in un programma assembler Mips. Quali riegistri posso usare? Nel senso fino ad ora ho usato nei programmi solo registri temporanei (t0, t1,..t9) e due/tre registri a0, a1 etc. Per fortuna sono riuscito sempre a conlcudere le procedure con solo questi registri. Ma se non dovessero bastare? E poi è corretto usare solo questi registri? So che c'è una convenzione ma non so applicarla bene. Dalla teoria so che ci sono vari tipo di registri:
t0,..t9 -> registri temporanei, che posso non salvare.
a0,..a3 -> registri delle variabili di ingresso.
s0,..s7 -> registri che devo salvare. (Quando devo salvarli non mi è chiaro).
v0,v1 -> registri di ritorno.

In pratica nello scrivere codice ho usato solo registri temporanei, stando attento a non sovrascrivere variabili che potevano essermi utili più avanti nella procedura. Magari è stato un po' rischioso perchè avrei potuto perdermi delle informazioni ma per fortuna per ora mi è andata bene. E' sbagliato scrivere procedure in questo modo?

La seconda domanda è: Quando devo usare lo stack? Sempre dalla teoria so che lo stack va usato per salvare dei parametri ma non riesco a pensare ad un programma concreto che lo usi. Forse una procedura ricorsiva? Quindi se scrivo tutto il programma in una procedura foglia non mi serve lo stack? Non capisco anche quando devo allocare/disallocare lo spazio per lo stack. Ho visto un esempio di come si fa ma non capisco perchè lo fa (posso fare benissimo senza, almeno in quell'esempio).

Scusate ma ho un po' di confusione in testa.

Grazie della disponibilità

4 Risposte

  • Re: Domande teoriche varie assembler Mips.

    Ciao
    ah finalmente qualche d'uno che è interessato alla teoria e non deve risolvere problemi ben specifici.
    allora veniamo alla prima domanda
    il tuo modo di utilizzare i registri non è sbagliato, anzi e prassi comune.
    però dipende dal programma che devi fare perchè se il dato che utilizzi deve essere conservato "salvato" ti conviene lavorare direttamente sui registri di tipo $s risparmiando codice di passaggio tra registri.
    poi ci sono registri dedicati quali ad esempio i registri $a, specifici per input, e $v, specifici per l'output, i quali svolgono compiti ben prestabbiliti e quindi utilizzati solo quando servono.
    per esempio per le syscall
    il registro $v0 serve per fissare la modalità di chiamata
    mentre il registro $a0 conterrà il parametro indispensabile alla syscall.
    esempio
    li $v0, 4 # chiama modalità di stampa
         la $a0, scelta # parametro alias stringa da stampare.
         syscall #richiama la funzione in questo caso di stampa. 
    
    poi oltre quelli che hai citato tu ci sono anche altri registri che hanno compiti ben specifici e che se non servono e meglio non utilizzare.
    questi sono:
    $ra serve per poter ritornare da una subroutine
    $gp contiene l'indirizzo di partenza della programma global area
    $sp stack pointer
    $fp frame pointer serve per memorizzare i parametri da passare ad una subroutine.
    $k.. riservati al sistema operativo
    $at riservato all'assembler e usato per settare opzioni di compilazione e ottimizzazioni.
    per il momento ho finito con la prima domanda naturalmente se non hai compreso qualcosa o hai dei dubbi chiedi pure.
    veniamo alla 2 domanda
    tu lo stack pointer non lo devi usare ma devi usare il frame point.
    lo stack lo gestisce automaticamente il sistema mentre il frame point molto simile allo stack
    te lo crei e te lo gestisci tu.
    il frame point come tu ben sai serve per passare i parametri un esempio di scopo potrebbe essere il seguente.
    date 2 date trovare quanti giorni e quante settimane sono trascorsi tra le 2 date
    adesso per risolvere il problema devi accettare 2 date
    quindi una routine accetterà le 2 date
    che poi saranno passate ad un altra routine che farà i calcoli
    e poi la routine chiamante stamperà i dati e magari chiederà se si vuole terminare o ricominciare.

    a questo punto sorge spontanea una domanda quando devo usare il frame point ?
    si utilizza nei seguenti casi:
    1) quando ci è espressamente richiesto
    2) quando si ha un numero eccessivo di parametri di solito parametri >2
    3) quando i dati da passare devono essere preservati perchè o si utilizzano parecchi registri all'interno della subroutine o perchè servono in fase conclusiva.
    4) se si vuol dare chiarezza al programma e quindi dividerlo in più parti
    5) quando i dati i parametri servono a più routine diverse.
    6) quando i dati da restituire sono più di 2.
    quando non usare il frame point.
    1)quando la routine e unica
    2)quando i parametri da passare sono <=2
    3) quando i dati da restituire sono <=2 e i parametri di input <=2
    4) quando ci sono risorse libere e non ci interessa usarle.

    ti ho elencato quando serve il frame point e quando non serve.
    spero di esserti stato di aiuto e se hai qualche domanda chiedi pure.
  • Re: Domande teoriche varie assembler Mips.

    Smalldragon ... si chiama frame pointer non frame point ...
  • Re: Domande teoriche varie assembler Mips.

    Scusa hai ragione
    comunque per il resto va bene
  • Re: Domande teoriche varie assembler Mips.

    Grazie mille della risposta, per ora mi sembra tutto chiaro. Proverò a fare degli esercizi per sperimentare queste convenzioni.

    Grazie ancora!
Devi accedere o registrarti per scrivere nel forum
4 risposte