|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Aug 2013
Messaggi: 68
|
Struct Mips
Ciao a tutti. Ho dei dubbi sull'uso delle struct nell'assembly MIPS. se ad esempio ho il seguente codice C:
struct elem{ char c; int i[2]; int *next;}type_elem; type elem h; come posso tradurlo in assembly? Soprattutto ho dubbi sulla dichiarazione. h: .space 13 va bene? ho considerato 1 char (1B), e due int, di cui uno è un vettore di due elementi (8B+4B): 1+8+4=13B |
|
|
|
|
|
#2 |
|
Member
Iscritto dal: Aug 2013
Messaggi: 68
|
Nessuno??
|
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Non conosco il processore in questione, ma dubito che l'occupazione di memoria per quella struttura sia di 13 byte.
Qui: https://en.wikibooks.org/wiki/MIPS_A...S_Instructions ho trovato che i processori MIPS devono allineare le strutture (farle cominciare ad un indirizzo - in generale - multiple di due). Siccome hai messo un byte all'inizio, ne dovrai saltare almeno 3 per allineare sui 4 bytes. Non sono sicure se devi allineare a 2 o 4 byte, purtroppo. Cmq occuperai piu' memoria di 13 byte. Quando mi trovo a lavorare con un processore che non conosco e voglio tradurre una struttura c.... lo faccio fare al compilatore Normalmente esiste un'opzione del compilatore per vedere il codice assembly generato, qualcosa tipo cc -S (non ricordo mai se maiuscolo o minuscolo). Trova l'opzione, fai generare la struttura e copiala
__________________
In God we trust; all others bring data |
|
|
|
|
|
#4 | ||
|
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Quote:
Quote:
La questione è, però, complessa, perché dipende dal modello di processore (se a 32 o 64 bit), e dall'ABI utilizzata da s.o. e compilatore (inclusi gli assemblatori). Assumendo che il processore sia a 32 bit, interi e puntatori occupano 4 byte per l'appunto, per cui i compilatori allineeranno questi tipi a multipli di 4 byte. Questo significa che, come detto da sottovento, il al primo byte per il char c ne verranno aggiunti altri 3 di padding. Il resto è come hai già calcolato. Quindi il totale fa 16 byte. Con l'assembly sei tu a definire gli offset dei singoli cambi, e dunque la dimensione dell'intera struttura, per cui se non stai attento puoi effettivamente allocare 13 byte, ma il programma solleverà un'eccezione quando tenterai di accedere ai campi int o puntatore, perché si troveranno a un indirizzo disallineato, mentre i processori MIPS sono in grado di leggere interi o puntatori (che sono la stessa cosa per loro) soltanto se sono allineati a 4 byte. Purtroppo conosco poco i MIPS, e non ho mai letto nulla sulla sintassi dell'assemblatore.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
||
|
|
|
|
|
#5 |
|
Member
Iscritto dal: Aug 2013
Messaggi: 68
|
Ho capito. Grazie a tutti per le risposte!
|
|
|
|
|
|
#6 |
|
Member
Iscritto dal: Aug 2013
Messaggi: 68
|
Scusate se continuo ma mi trovo davanti a situazioni che mi restano complicate...
se ho il seguente codice c: Codice:
typedef struct nodo {
void *data;
struct nodo *prossimo;
} Nodo;
typedef struct lista {
Node *testa;
Node *coda;
Node *current;
} Lista;
.
.
.
typedef Lista Stack;
Stack *stack
Nodo *nodo;
stack->testa = stack->testa->prossimo;
Codice:
stack: .space 12 #in quanto formato da 3 puntatori nodo: .space 8 #in quanto formato da 2 puntatori . . . la $s0,stack la $s1,nodo lw $t0,0($s0) #stack->testa lw $t1,4($t0) #stack->testa->prossimo sw $t1,0($s0) #stack->testa=stack->testa->prossimo |
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Va bene, ma $s1 non lo usi.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
|
|
|
|
|
#8 |
|
Member
Iscritto dal: Aug 2013
Messaggi: 68
|
Si, era un pezzo di esercizio e quell's1 é rimasto lí per sbaglio. Comunque grazie mille!
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 13:54.




















