[Assembly] Problemi con esercizi e di basi

Tarab1
Buongiorno,
mi trovo a dover studiare la materia "architettura dei calcolatori" non in lingua italiana! :shock:
Da quanto ho capito, abbiamo iniziato lo studio del linguaggio "Assembly" applicato a NIOS II e ARM (suppongo siano dei processori !? ).
Il problema è che forse danno parecchie basi per scontato ed io non riesco a venirne a capo.
Vi posto un esempio:

Segue la dichiarazione di variabili C

unsigned char toto[17];
short a,b,c,d,e,f;
double w[10], foo[4][5];
int out, cest, fini;


Ora, da quanto ho capito io e da quanto ricordo da informatica, dovrei avere questi valori
char = bit;
short = 2 bit;
double = 8 bit;
float = 6 bit;
int = 4 bit;

Il testo chiede:
Supponendo che la variabili toto[0] è all'indirizzo 1000 0000H, fornire gli indirizzi esadecimali delle variabili toto[16], a, f, y[0][0], foo[0][0], fini

Ancora, da quanto ho capito, parto in questo modo:

________|Decimale---|Esadecimale----|---Indirizzo|
toto[0]--|-----0------|------0--------|-1000 0000|
toto[1]--|-----1------|------1--------|-1000 0001|
...
...
toto[16]|-----16-----|------10-------|-1000 0010|
a--------|-----18-----|------12-------|-1000 0012|


Perchè ad esempio c'è questo "salto" di due cifre da toto[16] a "a" ? Perchè "a" è uno short, quindi 2bit?

E poi vorrei sapere se esiste una buona guida online per imparare l'assembly.

Ultima cosa: di NIOS II e ARM cosa mi dite? Mi confermate che sono processori?

Grazie.

Risposte
Rggb1
Mistype: char è 1 byte, short 2 byte e così via.

Non sono sicuro la variabile 'a' sia all'indirizzo base+18d; su ARM credo ci sia word alignment con parole di 4 byte - ma potrei sbagliarmi.

Comunque sia è a quell'indirizzo perché 'toto[16]' occupa l'indirizzo BASE+16, e visto che la successiva variabile dichiarata è 'a' questa seguira' 'toto' nello spazio di rilocazione: ma gli indirizzi base sono sempre calcolati per parola ('word', dove word==2 o 4 byte, talvolta 8 o addirittura 16), quindi per indirizzi in byte multipli di due, quattro o comunque pari. Quindi 'a' verrà memorizzata all'indirizzo BASE+18 (e se ho ragione io all'indirizzo BASE+20).

[ PS. Sono processori. ]

Tarab1
Forse sono riuscito a venirne a capo.
Ora, però, sono sorti altri problemi.
Ad esempio, questo esercizio su NIOS II:

Supponendo che il contenuto della memoria a partire dall'indirizzo C000 0000H è il seguente

-Indirizzo----|-Contenuto-|

C000 0000---| 10--------|
C000 0001---|32---------|
C000 0002---|54---------|
C000 0003---|76---------|
C000 0004---|98---------|
C000 0005---|BA---------|
C000 0006---|DC--------|
C000 0007---|EF---------|
C000 0008---|01---------|

Quali sono i contenuti dei registri dopo l'esecuzione del programma seguente (NIOS II utilizza little endian) ?

a) ORHI R1, 0xC000
b) LDW R2, 0(R1)
c) LDB R3, 5(R1)
d) LDH R4, 2(R1)
e) LDHU R5, 6(R1)
f) LDBU R6, 3(R1)

Analizzo, per esempio a)
l'istruzione ORHI è un'istruzione del tipo
orhi rB,rA,imm16 = rB<-- rA o imm16|0000 0000 0000 0000

Ma è proprio questo il mio problema: non riesco a capire questo genere di comandi.
Senza darmi la soluzione di ogni punto, potreste dirmi come si procede in questi casi per risolvere?
In questo corso non hanno fornito nessun tipo di base se non un elenco di questi comandi scritti nel modo sopra.

Grazie.

Rggb1
Si tratta delle descrizioni di "cosa fa" una istruzione in pseudocodice. Cosa non ti torna esattamente..? Magari rivediti la documentazione del processore...

Tarab1
Si, ma il mio problema è proprio capire lo pseudo codice.
Non abbiamo un libro di riferimento e perciò devo arrangiarmi online.
Come dicevo nel precedente messaggio:

Analizzo, per esempio a)
l'istruzione ORHI è un'istruzione del tipo
orhi rB,rA,imm16 = rB<-- rA o imm16|0000 0000 0000 0000

Ma è proprio questo il mio problema: non riesco a capire questo genere di comandi.

Rggb1
Allora, sul manuale NIOS II trovo
orhi - bitwise logical or immediate into high halfword
Operation: rB <- rA | (IMM16 : 0x0000)
Assembler Syntax: orhi rB, rA, IMM16
Example: orhi r6, r7, 100

Quindi cosa fa? Fa OR logico fra rA e una costante 16 bit (imm16 == immediate value 16 bits) estesa a zero, e mette il risultato in rB. Il significato "OR"-"HI" dovrebbe suggerirlo.

Però è strano, non sei abituato a queste descrizioni? Allora magari riguardatele, anche sul manuale del NIOS stesso, la parte iniziale dell'Instruction Set Reference:
http://www.altera.com/literature/hb/nio ... nii5v1.pdf
(pp. 181 e seguenti)

Tarab1
Grazie rggb,
è proprio questo che mi manca: un elenco con tutte le istruzioni, poichè non abbiamo nessun manuale di riferimento in questo corso (e infatti mi sembra molto strano come è strutturato questo corso).
Se sapessi anche consigliarmi dei manuali per ARM e NIOSII mi faresti un gran favore.
Intanto mi guardo il link che hai postato.

Grazie.

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