Oppure

Loading
25/11/12 15:10
Lionel
Ciao a tutti,

Sto sviluppando un'istruzione in ASSEMBLY per la macchina Mic1.

La microistruzione che devo svolgere è la seguente:
Si microprogrammi per mic-1 un段struzione, da aggiungere al set di IJVM, che implementi un
meccanismo di lock da utilizzare nel contesto di un sistema multicore. L段struzione sia:
LOCK address
e serva per prendere il lock su una risorsa. Il meccanismo è questo: l段struzione prima controlla
se all段ndirizzo address è presente il valore 0. In caso contrario, attende che il valore all段ndirizzo
address torni a 0. Una volta rilevato che il valore ad address è tornato a 0, l段struzione prova a
scriverci il valore in cima allo stack. Quindi rilegge il dato ad address, per sicurezza, e verifica
che la scrittura sia andata a buon fine (per giustficare il perché la scrittura potrebbe non andare
a buon fine, si immagini un contesto multicore, in cui due processori potrebbero cercare di
scrivere contemporaneamente due valori diversi, e il sistema potrebbe risolvere la questione
scegliendone uno caso). Se il valore controllato non è quello scritto, l段struzione si rimette in
attesa del ritorno a 0 della cella, per poi riprovare a scrivere, etc. Altrimenti, il lock si considera
acquisito e l段struzione termina.


Ci ho ragionato un attimo e ho provato a buttare giù una prima idea che è la seguente:
lockAddress1 MAR = SP; rd
lockAddress2 OPC = TOS
lockAddress3 TOS = MDR
lockAddress4 Z = OPC; if (Z) goto L; else goto lockAddress1

L TOS = MDR; wr
L2 TOS = MDR AND TOS //Faccio l'AND per verificare che le due parole siano uguali
L3 if (Z) goto main1; else goto lockAddress1 //se la parola è uguale vado al main1 altrimenti torno a lockaddress1

Però non sono per nulla soddisfatto......c'è qualcuno che può darmi qualche dritta?
aaa
25/11/12 16:06
tuttodiMC
Ma se dai un istruzione logica come valore alla variabile ottieni un valore boolean, ma se la variabile non la stampi come fai a verificare l'AND?
aaa
25/11/12 16:27
Lionel
Perchè è in TOS (Top of The stack) e la funzione if (Z) verifica se in cima alla pila c'è uno 0 oppure no.

o sbaglio?
aaa
26/11/12 16:21
tuttodiMC
Io ti parlo non perché conosco il linguaggio ma secondo la logica della programmazione. Se io creo una variabile in Lua nel seguente modo è come non averla creata:

local var = {}
local name = tuttodiMC
print("Il mio nome è ", name)
end


Dal codice che hai scritto mi sembra di capire questo.
Ultima modifica effettuata da tuttodiMC 26/11/12 16:23
aaa
27/11/12 9:33
Il Totem
Non conosco questa architettura. Ho un qualche familiarità solo con quella del motorola 68k, però mi sembra strano che tu possa semplicemente impostare il valore del registro tos e questo venga automaticamente scritto sullo stack. Inoltre il testo non dice che l'indirizzo da testare è presente sullo stack.
Contando che non mi ricordo quasi nulla di microcodice, io farei così:
// R0 contiene il valore di address
0: MAR(in), R0(out), read, WMFC
1: MDR(out), TEMP(in)
2: if TEMP is zero, goto 3, else 0
3: MAR(in), SP(out), read, WMFC
4: MDR(out), TEMP(in)
5: MAR(in), R0(out)
6: MDR(in), V(in), TEMP(out), write, WMFC
7: read, WMFC
8: MDR(out), Z(in), select(V), sub
9: if Z is zero, goto 10, else 0
10: end

R(in) abilita il buffer tristate di input per il registro R, mentre R(out) lo abilita per l'output. Il diagramma dell'architettura è riportato qui:
home.dei.polimi.it/silvano/FilePDF/ACSO/…
aaa