Double nell'assembly?

matitti
Devo tradurre una lunga serie di istruzioni dal C all'Assembly (del processore MIPS). In queste istruzioni sono dichiarate delle variabili Double, ma il processore gestisce i registri a 32 bit... come faccio ad operare con delle double(64 bit)?
Ad esempio è dichiarato un vettore
double a[100]
e magari devo fare questa istruzione:
a[10]=20
.
Come faccio a dichiararlo ed ad indirizzarlo?

Risposte
ulven101
Ciao. Non conosco il processore con cui stai lavorando, ho dato solo una rapida occhiata a http://en.wikipedia.org/wiki/MIPS_architecture#MIPS_assembly_language.
Stando a quanto c'è scritto, il tipo double non è presente in tutti i processori della stessa famiglia a 32 bit. Dovresti far riferimento al datasheet. In ogni caso, se fossero supportati, vengono trattati come due single precision a 32 bit.
Purtroppo non è facile dare una mano quando si tratta di programmazione in assembly.
Indicativamente, per la prima istruzione, utilizzerei una direttiva che alloca per 100 volte un double non inizializzato, resituendo ad un'etichetta l'indirizzo al primo di essi. Non sapendo quale sintassi usi, non so scriverti nulla di più specifico.
Per la seconda istruzione, prendi l'etichetta di prima (che contiene un indirizzo), la incrementi di 10 e vi sposti, a quell'indirizzo, il valore numerico.

matitti
l'etichetta che intendi te dovrebbe essere
a: .double <val>
e dichiaro quanti valori voglio per il label a. Avevo pensato poi a caricare con un load address (la) l'indirizzo in un registro, ad esempio:
la $s0,a
e per indirizzarlo faccio come dici te, incremento di 10 ma essendo una double dovrei moltiplicare il valore per 8 Byte (64bit) corretto? Quindi:
addi $s0,$0,10
sll $s0,8

Un dubbio che mi affligge poi è che non posso dichiarare 100 valori per la double, anche perché nella dichiarazione
double a[100]
non sono espliciti i valori all'interno del vettore, mentre con l'etichetta ".double" lo devono essere. Quindi non so come fare...

ulven101
"matitti":
e per indirizzarlo faccio come dici te, incremento di 10 ma essendo una double dovrei moltiplicare il valore per 8 Byte (64bit) corretto? Quindi:
    addi $s0,$0,10
    sll $s0,8 

Eh... questa è un'ottima domanda :-D
Dubito che nell'assembly vi sia una gestione ad alto livello dei puntatore come nel C, quindi credo che tu debba fare così. Nel caso falle un paio di prove.

"matitti":
Un dubbio che mi affligge poi è che non posso dichiarare 100 valori per la double, anche perché nella dichiarazione
    double a[100]

non sono espliciti i valori all'interno del vettore, mentre con l'etichetta ".double" lo devono essere. Quindi non so come fare...


Hai presente la direttiva res nella sintassi intel? Ti permette di allocare memoria senza inizializzare i dati. Usare qualcosa del genere per la tua architettura, secondo me, può essere utile. Allochi 8 KB consequenzialmente ed ecco che hai il tuo array in stile C :-D

matitti
ho trovato una soluzione che non conoscevo, la scrivo nel caso qualcuno abbia avuto i miei stessi problemi. Per allocare l'array di double: [code]a: .double 0:10 [\code] così dovrebbe allocare 10 elementi senza inizializzare i dati. Per quanto riguarda l'indirizzamento ancora ho dei dubbi...appena posso farò delle prove ma se qualcuno mi sa rispondere mi farebbe un grande piacere. Comunque grazie ulven101!

matitti
non funziona.... =(

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.