Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Altri Linguaggi - Assembly IJVM
Forum - Altri Linguaggi - Assembly IJVM

Avatar
Lionel (Normal User)
Newbie


Messaggi: 2
Iscritto: 25/11/2012

Segnala al moderatore
Postato alle 16:10
Domenica, 25/11/2012
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’istruzione, da aggiungere al set di IJVM, che implementi un
meccanismo di lock da utilizzare nel contesto di un sistema multicore. L’istruzione sia:
LOCK address
e serva per prendere il lock su una risorsa. Il meccanismo è questo: l’istruzione prima controlla
se all’indirizzo address è presente il valore 0. In caso contrario, attende che il valore all’indirizzo
address torni a 0. Una volta rilevato che il valore ad address è tornato a 0, l’istruzione 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’istruzione si rimette in
attesa del ritorno a 0 della cella, per poi riprovare a scrivere, etc. Altrimenti, il lock si considera
acquisito e l’istruzione 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?

PM Quote
Avatar
tuttodiMC (Normal User)
Expert


Messaggi: 327
Iscritto: 29/10/2012

Segnala al moderatore
Postato alle 17:06
Domenica, 25/11/2012
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?

PM Quote
Avatar
Lionel (Normal User)
Newbie


Messaggi: 2
Iscritto: 25/11/2012

Segnala al moderatore
Postato alle 17:27
Domenica, 25/11/2012
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?

PM Quote
Avatar
tuttodiMC (Normal User)
Expert


Messaggi: 327
Iscritto: 29/10/2012

Segnala al moderatore
Postato alle 17:21
Lunedì, 26/11/2012
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:

Codice sorgente - presumibilmente Altri Linguaggi

  1. local var = {}
  2. local name = tuttodiMC
  3. print("Il mio nome è ", name)
  4. end



Dal codice che hai scritto mi sembra di capire questo.

Ultima modifica effettuata da tuttodiMC il 26/11/2012 alle 17:23
PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 10:33
Martedì, 27/11/2012
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ì:
Codice sorgente - presumibilmente Delphi

  1. // R0 contiene il valore di address
  2. 0: MAR(in), R0(out), read, WMFC
  3. 1: MDR(out), TEMP(in)
  4. 2: if TEMP is zero, goto 3, else 0
  5. 3: MAR(in), SP(out), read, WMFC
  6. 4: MDR(out), TEMP(in)
  7. 5: MAR(in), R0(out)
  8. 6: MDR(in), V(in), TEMP(out), write, WMFC
  9. 7: read, WMFC
  10. 8: MDR(out), Z(in), select(V), sub
  11. 9: if Z is zero, goto 10, else 0
  12. 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:
http://home.dei.polimi.it/silvano/FilePDF/ACSO/esercitazio ...

PM Quote