LINGUAGGIO ASSEMBLY DAL LINGUAGGIO MACCHINA VERSO LINGUAGGI DI ALTO LIVELLO Come semplificare la stesura di codice macchina? L’ASSEMBLY propone di sostituire i codici binari in PAROLE CHIAVE che possono essere “ricordate” dal programmatore e che quindi hanno più senso per lui. Per questo motivo si parla spesso di “codice mnemonico”. Si può scrivere il codice in un linguaggio più umano… E poi farlo TRADURRE in linguaggio macchina. Il programma che traduce si chiama ASSEMBLER. 1 Quali gli elementi dell’Assembly? -Utilizzo di nomi simbolici per indicare locazioni di memoria; -Utilizzo di nomi simbolici per indicare le istruzioni di base eseguibile dalla CPU. COMMENTO: Si trarra di istanze estremamente elementari e “povere” dei concetti fondamentali della programmazione imperativa: VARIABILI, OPERATORI, FUNZIONI Indirizzi Simbolici Una locazione di memoria viene indicata attraverso un nome simbolico anziché un indirizzo effettivo. Esempio: l’indirizzo di memoria 01010101 viene indicato con il nome simbolico: “casa”. Ogni qualvolta la macchina incontrerà il simbolo “casa” andrà ad “allocare” la parte di memoria che inizia dal punto 01010101 2 I COMANDI UN ELENCO PER TIPI • TRASFERIMENTI DI DATI DA UNA LOCAZIONE DI MEMORIA AD UN’ALTRA; • OPERAZIONI ARITMETICHE; • CONFRONTO; • CODICI DI CONDIZIONE ED ETICHETTA DI ISTRUZIONE. TRASFERIMENTI DI DATI DA UNA LOCAZIONE DI MEMORIA AD UN’ALTRA RAPPRESENTEREMO UNA LOCAZIONE DI MEMORIA VUOTA COME COSTITUITA DA 8 BIT IN QUESTO MODO: FFFGHKKKKKKKK 3 ESEMPIO DEL PASSAGGIO DEL DATO 00001111 DALLA LOCAZIONE DI MEMORIA A ALLA LOCAZIONE DI MEMORIA VUOTA B 0 0 0 0 11 1 1 KKKKKKKK A KKKKKKKK 0 0 0 0 11 1 1 A KKKKKKKK B KKKKKKKK 0 0 0 0 11 1 1 B SE LA MEMORIA DI ARRIVO NON E’ VUOTA? SEMPLICEMENTE RISCRIVE IL DATO SOPRA IL PRECEDENTE CANCELLANDONE MEMORIA! 4 ESEMPIO DEL PASSAGGIO DEL DATO 00001111 DALLA LOCAZIONE DI MEMORIA A ALLA LOCAZIONE DI MEMORIA B CHE CONTIENE 01010110 0 0 0 0 11 1 1 KKKKKKKK A KKKKKKKK 0 0 0 0 11 1 1 A KKKKKKKK 0 1 0 10 1 1 0 B KKKKKKKK 0 0 0 0 11 1 1 B ELENCO DEI COMANDI DI ASSEMBLER PER IL TRASFERIMENTO DATI • LOAD <indirizzo simbolico> <nome registro>; • STORE <nome registro> <indirizzo simbolico>; • MOVE <nome registro> <nome registro>; 5 ESEMPIO DI LOAD: copia il contenuto della memoria indicata con indirizzo simbolico “casa” nel registro “R ” 0 0 00 1 1 1 1 KKKKKKKK casa 0 0 00 1 1 1 1 KKKKKKKK casa KKKKKKKK R 0 0 00 1 1 1 1 KKKKKKKK R ESEMPIO DI STORE: copia il contenuto del registro “R” nella memoria indicata con indirizzo simbolico “casa” 0 0 00 1 1 1 1 KKKKKKKK KKKKKKKK R casa 0 0 00 1 1 1 1 KKKKKKKK R 0 0 00 1 1 1 1 KKKKKKKK casa 6 ESEMPIO DI MOVE: copia il contenuto del registro “R” nel registro “M” 0 0 00 1 1 1 1 KKKKKKKK R 0 0 00 1 1 1 1 KKKKKKKK R KKKKKKKK M 0 0 00 1 1 1 1 KKKKKKKK M OPERAZIONI ARITMETICHE • ADD <operando><registro>(somma l’operando al contenuto del registro) • SUB <operando><registro>>(sottrae l’operando al contenuto del registro) • MULT<operando><registro>>(moltiplica l’operando al contenuto del registro) • DIV<operando><registro>>(divide l’operando al contenuto del registro) 7 ESEMPIO1 (1)LOAD x,R1 (2)ADD #2,R1 (3)STORE R1,risultato Aggiunge 2 a x ISTRUZIONE DI CONFRONTO COMPARE<registro1><registro2> Confronta il contenuto dei due registri ed agisce sul contenuto dei codici condizione 8 STATO DEI CODICI CONDIZIONE Esempio: COMPARE R,M EQ NE LT LE GT GE R=M 1 0 0 1 0 1 R<M 0 1 1 1 0 0 R>M …. …. …. …. …. …. ……. …. …. …. …. …. …. ……. …. …. …. …. …. …. ……. …. …. …. …. …. …. ISTRUZIONI DI SALTO • BREQ<etichetta> (salta all’etichetta indicata se EQ=1) • BRNE<etichetta> • BRLT<etichetta> • BRLE<etichetta> • BRGT<etichetta> • BRGE<etichetta> • BRANCH<etichetta> (salto incondizionato all’etichetta indicata) 9 ESEMPIO2 (1)LOAD a, R1 (2)LOAD b,R2 (3)COMPARE R1,R2 (4)BRGE etich1 (5)ADD R2,R1 (6)STORE R1,a (7)BRANCH etich2 (8)etich1:SUB R2,R1 (9)STORE R1,B (10)etich2: Se a<b somma “b” ad “a”, altrimenti lo sottrae Osservazioni È facile sbagliare nella stesura del codice. Il programma precednete è lungi dall’essere un esempio ideale! Nel codice della slide precedente il risultato va a finire nella locazione “a” in un caso e nella locazione “B” in un altro. Ma quale è la locazione “B”? Essa è diversa dalla “b” introdotta all’inizio? Ancora: abbiamo usato nomi poco significativi “a”, “b”, “etichetta1” etc. Questo rende la correzione di eventuali errori e la comprensione del codice più complicata. Meglio usare nomi espressivi! 10 Un supporto grafico alla comprensione di un programma LOAD a,R1 LOAD b,R2 ADD R1,R2 COMPARE R1,R2 NOT BRGE STORE R1,a BRGE END SUB R1,R2 STORE R1,b Confronto: dal basso all’alto livello LOAD a,R1 LOAD b,R2 ADD R1,R2 COMPARE R1,R2 … 00000010 00110010 00001000 00011000 …. …. 00000100 00100010 LOAD a, R1 LOAD b,R2 COMPARE R1,R2 BRGE etich1 ADD R2,R1 STORE R1,a BRANCH etich2 etich1:SUB R2,R1 STORE R1,B etich2: NO T BR GE BR GE STORE R1,a END SUB R1,R2 STORE R1,b IF (a<b) THEN a+b ELSE a-b Se a<b allora restituisci a+b altrimenti restituisci a-b 11