Mostra notizie nelle discussioni
Avatar
☺
Scritto da
altg
utente che non utiene
il 2013-09-04 16:31:26.0 alle 2013-09-04 16:31:26.0
Trollate totali: 11540
Panoramica sull'ambiente di run-time Lino 3
Immagine postata dall'utente

Ho appena finito di scrivere la "trap" della versione 3. E` una subroutine che di norma interrompe l'esecuzione e stampa il contenuto dei registri e un breve dump dello stack. Nella versione 3, ho aggiunto le unita` di stato correnti delle interfacce esposte dal modulo di run-time, e il contenuto attuale delle unita` di comando (PCMD = pending command). Il listatino imposta i 5 registri generici e quello di riserva a valori semplici da ritrovare nel dump, e pusha un paio di unita` sullo stack, poi visibili dopo l'indirizzo di ritorno della chiamata a "trap", ovviamente in ordine inverso perche` lo stack e` LIFO.

Allora, il bit meno significativo di ogni unita` di stato e` il flag di "presenza", significa che la corrispondente interfaccia e` implementata e connessa. Nel dump ci sono tutte meno "file" (perche` il flag di presenza e` condizionato dall'esistenza del file su cui sta lavorando, e non si e` ancora fatto nulla su nessun file) e le quattro "estensioni modulari", cioe` interfacce che possono essere incluse nell'eseguibile su opzione (Auxiliary Pointing Devices, audio, network sockets, printer) e di cui il listato di prova non richiede l'inclusione. Il bit a sinistra di quello e` il flag di errore (nessun'interfaccia lo riporta, nel dump), gli altri hanno significati specifici dell'interfaccia (c'e` il bit "active" del display che indica che la finestra ha il fuoco dell'user input, e nella pointer c'e` il bit che indica che il puntatore del mouse e` attualmente visibile).

Tra i registri, da A ad E sono i registri generici, di cui solo E e` designato callee-saved (vedere wikipedia?) e di solito viene usato come puntatore alla base del frame delle variabili locali. Il registro O e` l'origine dei dati, relativamente al quale tutti i puntatori a dati sono mappati (sia dati statici che blocchi di heap). Il registro $ e` lo stack pointer, il puntatore alla cima dello stack all'ingresso in "trap". Il registro % e` lo spare register, il registro "di riserva" usato per i trasferimenti da memoria a memoria e per appoggio in altre istruzioni, nonche` il contenitore designato per il valore di ritorno delle funzioni. Poi c'e` la superglobale "f", che e` una variabile sempre accessibile con lo stato dell'ultima chiamata (subroutines e funzioni possono usarlo per riportare al chiamante come sono andate le cose: f = 1 significa che la chiamata ha avuto successo, cioe` ha svolto quel che era richiesto, 0 significa che qualcosa e` andato storto, e di solito implica che se era previsto un valore di ritorno, questo dovrebbe essere ignorato perche` il suo valore attuale non ha senso, infatti "f" serve a riportare lo stato al di la` del valore di ritorno, in modo da non dover riservare codici d'errore particolari tra i possibili valori di ritorno). Poi c'e` "0", che e` il modo in cui si chiama convenzionalmente il puntatore all'origine del codice, relativamente al quale avviene la rilocazione dei salti ad indirizzi assoluti, e quindi relativamente al quale tutti gli indirizzi di codice sono espressi. Infine ci sono le prime tre unita` in cima allo stack.

L'ho spiegato bene? Newbie, inesperto
Avro` dato fastidio a Lich? Imbarazzato

Pagina generata in 116 millisecondi

Utenti attivi: 12 nell'ultimo minuto, 24 negli ultimi cinque minuti, 48 negli ultimi 15 minuti