Marco Vanadia [email protected]DEE Politecnico di Bari Esercitazione Calcolatori Elettronici 6 dicembre 2007 Esercitazione sul linguaggio Assembly del DLX Ambiente di simulazione di processori in architettura RISC WinDLX 1 1 2 2 http://www.slideshare.net/mova/esercitazione-calcolatori-elettronici-vanadia-2007-12-06/
Ambiente di simulazione di processori in architettura RISC WinDLX
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
.align nallineamento del codice e dei dati all'indirizzo successivo con i primi n bit meno significativi posti a zero
alloca le stringhe alfanumeriche nel codice oggetto che poi saranno caricate in memoria; le stringhe non sono terminate con il carattere zero
alloca le stringhe alfanumeriche nel codice oggetto che poi saranno caricate in memoria; le stringhe sono terminate con il carattere zero
.byte byte1, byte2,...alloca una sequenza di byte nel codice oggetto che poi saranno caricate in memoria
.double number1, number2,...alloca una sequenza di double, numeri floating point a doppia precisione di 64 bit nel codice oggetto che poi saranno caricate in memoria
.float number1, number2,...alloca una sequenza di float, numeri floating point a singola precisione di 32 bit nel codice oggetto che poi saranno caricate in memoria
.global labeldefinisce una etichetta come globale, un riferimento a questa locazione è disponibile ad altri codici oggetto linkato a questo sorgente
.space size lascia lo spazio per size bytes quando il codice sarà caricato in memoria
Assemblatore Linker Loader● Un programma in linguaggio assembly è codificato in un file oggetto
usando un programma assemblatore. Un assemblatore legge un singolo file sorgente e produce il file oggetto assemblando tutte le informazioni necessarie a descrivere il codice e i dati. Queste verranno poi messe assieme da un linker a formare un programma eseguibile o una libreria, caricati in memoria da un loader all'atto dell'esecuzione o invocazione.
● Il file oggetto comincia con un'intestazione, un header, ed è formato da uno o più segmenti contenenti il codice macchina e la rappresentazione binaria dei dati. Vengono salvate le informazioni sulla rilocazione per le parole che dipendono dall'indirizzo assoluto in memoria in cui è caricato ogni segmento.
● Inoltre viene salvata la symbol table delle label che possono essere indirizzate da altri file sorgente e la lista di tutti i riferimenti esterni irrisolti. Per finire possono esservi informazioni di debugging.
LW R2, N ; carica N in R2 SLLI R2, R2, #2 ; moltiplico per 4 shiftando a sx di 2loop: SW vettore-4(R2),R0 ; pone 0 alla M[R2 + (vettore-4)] SUBI R2, R2, #4 ; uso R2 come indice e decremento di 4 BNEZ R2, loop ; salta a loop se non uguale a zero trap 0 ; per fermare windlx .dataN: .word 8vettore:.word 1,2,3,4,5,6,7,8
Esercizio Assembly #7● Scrivere nel linguaggio Assembly di una
architettura DLX-like scalare (non pipe), la procedura che esegue la somma di due vettori di n elementi interi, espressi su singola word, allocati in memoria a partire dagli indirizzi rispettivamente contenuti negli registri R1 ed R2, ponendo il risultato a partire dall'indirizzo contenuto nel registro R3.
loop: LD F0, 0(R1) ADDD F4, F0, F2 SD 0(R1), F4 ADDI R1, R1, #-8 BNEZ R1, loope fornire una sua versione srotolata per 6 volte schedulata in maniera opportuna.
vedi H&P pag.271 (par.6.8 pipelining avanzato ILP, srotolamento e schedulazione)
● tecniche per ridurre gli stalli● Loop unrolling – per gli stalli di controllo● Pipeline scheduling – riduce gli stalli RAW● Register renaming – riduce gli stalli WAR e WAW● Dynamic branch prediction – per gli stalli di controllo● Superscalar pipeline – riduce CPI ideale
● la LD causa stallo strutturale nella fase MEM per la dipendenza con la EXE di ADDD● la ADDD causa un doppio stallo RAW per la dipendenza con SD● la ADDI causa uno stallo RAW per la dipendenza con la fase ID del branch● il branch quando salta indietro richiede uno stallo di controllo
● schedulo l'aggiornamento dell'indice nel delay slot della load● schedulo la store del risultato nel delay slot della branch (non previsto da WinDLX)● la store dipende da R1 ma sfruttare il campo immediato per avere l'indirizzo corretto