[Assembly] non riesco a capire questo programma

Pubblicità

Jackoz33

Utente Attivo
Messaggi
198
Reazioni
2
Punteggio
53
Salve,

Volevo chiedervi se sapete cosa fa esattamente questo programma? Per capirlo credete che devo porre al posto dei parametri che ha (che dovrebbero essere 2) dei numeri e poi provarlo?
Inoltre ci sono degli errori? Se si quali sono?
Ultimo dubbio mi sembra che i registri t7 e t8 vengano prima caricati dalla memoria e poi scritti in memoria il che non credo sia giusto.
Inoltre non capisco una cosa: le due istruzioni di load (lw) che ci sono non si dovrebbero usare per gli array? Oppure in questo caso sono usate per indicare che i registri t6 e t4 sono già in memoria?

 
Ciao,

dove hai tirato fuori questo codice?
non uso assembly... ma a livello logico dovrebbe comportarsi nel modo seguente (pseudo-C):

Codice:
t0 = 0;
t1 = A1 - 1;

while(t0 != t1) // label1
{
    t3 = t0 + 1;
    t2 = t0 * 4;    // rappresenta la sequenza di istruzioni t2 = t0 + t0; t2 = t2 + t2;
                    // ovvero t2 = t0 + t0 + t0 + t0;
    t4 = A0 + t2;

    while(t3 != A1) // label2
    {
        t5 = t3 * 4; // idem con patate
        t6 = A0 + t5;
        t7 = i primi 4 byte di memoria a partire dall'indirizzo t6;
        t8 = i primi 4 byte di memoria a partire dall'indirizzo t4;

        if(t8 > t7) // inverto la condizione ">=" per simulare la semantica del jump
        {
            carica t8 in memoria a partire dall'indirizzo t6;
            carica t7 in memoria a partire dall'indirizzo t4;
        }

        // label5
        t3++;
    }

    // label4
    t0++;
}

// label3
v0 = A0;
jump all'indirizzo in ra
A prima vista sembrerebbe insensato, considerando anche che non dai alcuna informazione in merito... come ad esempio una descrizione dei parametri in input e l'eventuale fase di inziailizzazione...
guardando più attentamente sembrerebbe che A0 e A1 (scritti volutamente in maiuscolo) siano due parametri in ingresso e che il programma utilizzi una certa area di memoria come se fosse un array di elementi da 4 byte

Ultimo dubbio mi sembra che i registri t7 e t8 vengano prima caricati dalla memoria e poi scritti in memoria il che non credo sia giusto.
infatti si, sembrerebbe caricare garbage dalla memoria...
in realtà credo che al codice che hai postato preceda una fase di inzializzione di tale area di memoria.

In particolare, analizzando il codice, sembra che l'area di memoria non sia altro che un array di elementi a 4 byte pre-inizializzato e che A0 e A1 siano parametri in ingresso, rispettivamente l'inizio dell'area di memoria e il numero di elementi.
I motivi dei '*4' sono dovuti alla necessità di spostarsi di 4 byte mentre l'if implementa uno swap dei due elementi puntati da t4 e t6.

Alla fine della fiera sembrerebbe un algoritmo di ordinamento e, nello specifico, del bubblesort. Non ne sono sicuro perchè nn l'ho controllato bene... lascio a te l'onore/onere di accertarlo.

Inoltre non capisco una cosa: le due istruzioni di load (lw) che ci sono non si dovrebbero usare per gli array? Oppure in questo caso sono usate per indicare che i registri t6 e t4 sono già in memoria?
tratto da wikipedia ("MIPS architecture"):
lw $t, C($s)
load word: loads the word stored from: MEM[$s+C] and the following 3 bytes.
e si comporta nel modo seguente: $t = Memory[$s + C]


spero di esserti stato d'aiuto,
ciao.
 
Ultima modifica:
Pubblicità
Pubblicità
Indietro
Top