Corso di Calcolatori Elettronici I A.A. 2010-2011 Introduzione alla programmazione assembly Lezione 21 Università degli Studi di Napoli Federico II Facoltà di Ingegneria Organizzazione Motorola 68000 Holds address of the next instruction to be executed Program Counter (PC) 32 If necessary Holds the address of memory reads/writes Effective Address Register (EAR) 32 Internal Bus Instruction Register(IR) 16 Instruction Decode and Control General Registers D0..D7 A0..A6 A7= User Stack pointer (USP) A7’=Supervisor Stack Pointer(SSP) 32 Memory and I/O Interface Control Pipeline Temporary Register External Bus Holds first word of currently executing instruction 32 Holds operands or intermediate results Performs all logical or arithmetic operations ( ADD, SHIFT, etc. ) Arithmetic and Logic Unit (ALU) 32 8 CCR SR Holds result of ALU Operations Modello di programmazione del MC68000 31 16 15 8 7 0 D0 D1 D2 D3 D4 D5 D6 D7 T S I2 I1 I0 A0 A1 A2 A3 A4 A5 A6 A7 PC X N Z V C SR Status register Ø Contiene: Ø La interrupt mask (8 livelli) Ø I codici di condizione (CC) - oVerflow (V), Zero (Z), Negative (N), Carry (C), e eXtend (X) Ø Altri bit di stato - Trace (T), Supervisor (S) Ø I Bits 5, 6, 7, 11, 12, e 14 non sono definiti e sono riservati per espansioni future Esempio di generazione di codice assemblato PLC 00000000 00002000 00002000 00002006 0000200C 00002012 00002018 0000201E 00002024 00002028 0000202A 00002030 00002030 00002032 00002034 00002034 contenuto label 4279 2032 3039 2034 33C0 2030 D079 2032 33C0 2032 3039 2030 0640 FFFF 66E2 4EF9 8008 =8008 =0011 0011 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 opcode operands comments * Un commento non fa incrementare il PLC ORG $2000 START CLR.W SUM Riferimento in avanti MOVE.W ICNT,D0 ALOOP MOVE.W D0,CNT ADD.W SUM,D0 MOVE.W D0,SUM MOVE.W CNT,D0 ADD.W #-1,D0 BNE ALOOP JMP SYSA SYSA EQU $8008 CNT DS.W 1 SUM DS.W 1 IVAL EQU 17 ICNT DC.W IVAL Symbol Table ALOOP START 200C 2000 CNT SUM 2030 2032 IVAL ICNT 0011 2034 Formato delle istruzioni assembly • Le istruzioni assembly sono tipicamente costituite da un codice mnemonico seguito da uno o più operandi. • Ad esempio, le istruzioni a due operandi per il trasferimento e le operazioni aritmetiche sui dati sono tipicamente nella forma: Operazione Sorgente,Destinazione • Per esempio, per effettuare la somma tra due numeri si potrà scrivere: ADD A,B • Questo comando realizza la somma di A e B e porrà il risultato dell operazione in B sovrascrivendone il contenuto corrente. Formato Istruzioni del 68000 • La prima word di una istruzione è chiamataOpcode word – Tuute le informazioni necessarie per decodificare un’istruzione sono nell’ Opcode Word – Contiene un opcode (cosa fa) – Contiene zero,uno o due effective address fields (EA) • L’istruzione completa in memoria può contenere l’ opcode word ed altre word di istruzioni addizionali – Un’istruzione può richiedere fino a 5 word di memoria • La forma generale della istruzione assembly è la seguente: Label OP CODE sorgente, destinazione *Comment Esempio: l istruzione MOVE • Volendo realizzare una copia del contenuto di un registro in un altro, ad esempio, il linguaggio assembly potrebbe richiedere di scrivere: MOVE R0,SOMMA • Il codice mnenonico, in questo caso MOVE, rappresenta l azione svolta dall istruzione. • L assemblatore traduce questo codice mnemonico in un codice binario di forma comprensibile al calcolatore, di solito chiamato codice operativo (OP-CODE). • Segue almeno uno spazio bianco dopo il quale sono riportate le informazioni che specificano gli operandi. MOVE (MOVE) • L’istruzione più comunemente usata per il movimento dati è MOVE • Muove - Copia da una sorgente a una destinazione MOVE [sorgente], [Destinazione] • Esempio MOVE.W D2, $1300 • copia il contenuto del registro D2 nell'area di memoria di indirizzo esadecimale 1300 L’istruzione MOVE • Istruzioni di movimento dati tipiche del 68000 sono: MOVE Di, Dj MOVE M, Di MOVE Di, M MOVEA - utilizza semre registri indirizzi come destinazione e non impatta lo Status Register MOVEQ - (quick move) utilizzata per il movimento di valori piccoli (fino a 8 bits, i.e. -127 to +127) nei registri dati (e.g. MOVEQ.B #3,D3) Operazioni Aritmetiche Operazioni aritmetiche duali operazione sorgente, destinatario che tipicamente funziona come segue: destinatario ? sorgente → destinatario dove ? È una delle operazioni aritmetiche (+,-,* or /) e.g. ADD D0,D1 D1 + D0 → D1 SUB D0,D1 D1 - D0 → D1 MUL D0,D1 D1 * D0 → D1 DIV D0,D1 D1 / D0 → D1 ADD (ADD) • Aggiungi - Aggiunge un valore a una destinazione ADD [valore], [Destinazione] • Esempio ADD D1, SOMMA • aggiunge il contenuto del registro D1 nella variabile di memoria SOMMA Gli operandi • Nel nostro esempio, l operando sorgente è nel registro D1. • Questa informazione è seguita dall indicazione dell operando destinazione, separato da quello sorgente attraverso una virgola. • L operando destinazione è nella locazione di memoria il cui indirizzo è rappresentato dal nome simbolico SOMMA. • Per creare questa associazione, ogni nome deve essere opportunamente definito nell ambito del listato creando così un associazione SIMBOLO -> INDIRIZZO. Natura degli operandi • Gli operandi forniti come argomento di un istruzione possono contenere informazioni di tipo differente. • Può accadere che l operando contenga direttamente il valore utile per il calcolo. In questo caso si parla di operando immediato ed esso è direttamente codificato di seguito all istruzione. • In altri casi l operando contiene il riferimento ad un registro del processore il quale può contenere, a sua volta, il dato o (ancora) l indirizzo di un registro della memoria in cui è contenuto il dato. Natura degli operandi: esempio. • Nell istruzione ADD #9,D0 il primo operando è di tipo immediato. Il suo valore viene codificato in memoria direttamente assieme all istruzione. Il secondo operando è un registro interno del processore. • Nell istruzione ADD D0,D1 entrambi gli operandi sono riferimenti a registri interni. • L istruzione ADD D0,#9 è priva di senso dal momento che l operando destinazione non specifica una locazione di memoria in cui porre il risultato dell operazione. Esempio: la somma di due registri • Supponiamo di voler realizzare l istruzione C++ C = A + B; • Questa istruzione ha lo scopo di sommare il contenuto delle locazioni di memoria individuate dagli identificatori A e B e, successivamente, di porre il risultato della somma nella locazione di memoria individuata dall identificatore C. • Se il linguaggio assembly rende disponibile esclusivamente un istruzione per la somma a due operandi (come in genere accade), non è possibile realizzare l elaborazione in un unico passo, ma bisognerà scrivere: MOVE B,C ADD A,C Registri interni e memoria (1) • Un istruzione, in generale, può coinvolgere sia i registri interni che i registri della memoria. • L accesso ai registri interni è molto più veloce dell accesso ai registri della memoria, poiché i primi sono già all interno del processore e non sorge dunque la necessità di trasferimenti attraverso canali esterni. • Inoltre, i registri interni sono in numero molto minore delle celle di memoria (tipicamente da 8 a 64) e quindi per essere indirizzati c è bisogno di pochi bit. Registri interni e memoria (2) • Ad esempio, un processore che abbia 32 registri interni, può indirizzarli utilizzando 5 bit. • Poiché l uso di registri interni permette elaborazioni più rapide e produce istruzioni più corte, essi sono usati per memorizzare dati temporanei nella CPU durante l elaborazione. • In alcuni casi, determinati comandi assembler possono operare esclusivamente su registri interni; operazioni su registri di memoria non sono ammesse e, su necessità, bisogna esplicitamente provvedere al trasferimento dei dati tra la memoria e i registri interni. Esempio: codifica di un istruzione (1) • • A titolo esemplificativo prendiamo in considerazione l istruzione ADD #9,D3 • che che ha come effetto la somma di 910 al contenuto del registro D3 e la memorizzazione del risultato di nuovo in D3. • Nel caso del M68000: – il comando ADD da sorgente a registro dati si codifica con 1101---0-----– L indice del registro si codifica con ----011--------– La modalità operando immediato si codifica con ----------111100 – La dimensione dell operando (di default word) si codifica con: --------01------ • La stringa completa dà: 11010110011111002 = D67C16 Esempio: codifica di un istruzione (2) • L assembler 68000 permette di specificare il tipo di dato a cui si sta facendo riferimento, aggiungendo un suffisso allo mnemonico del istruzione: .B per dati di tipo byte .W per dati di tipo word .L per dati di tipo long. • Esempio: MOVE.W DO, D1 Pseudo-operatori ORG (Origin) Viene usato per inizializzare il Program Location Counter (PLC) Sintassi: ORG $HEXADDR es. ORG $1000 END Viene usato per terminare il processo di assemblaggio e saltare all entry point del programma Sintassi: END TARGETLAB Altri pseudo-operatori DS (Define Space) • Viene usato per incrementare il Program Location Counter (PLC), in modo da riservare spazio di memoria per una variabile • Sintassi: LABEL DS.W NUMSKIPS • Esempio TOP DS.B 10 * ho assegnato 10 byte per TOP DC (Define Constant) • • • Viene usato per inizializzare il valore di una variabile Sintassi: LABEL DC.W VALUE Esempio PLUTO DS.B 10 * ho assegnato 10 a PLUTO EQU (Equate) • Viene usato per stabilire un identità • Sintassi: LABEL EQU VALUE • Esempio PIPPO EQU 1234 ; Ogni volta che uso #PIPPO in un istruzione equivale a usare il valore 1234 CMP Compare Operatione: [destinazione] - [sorgente] Sintassi: CMP <ea>,Dn Esempio: CMP (Test,A6,D3.W),D2 Attributi: Size = byte, word, longword Descrizione: Sottrae l operando sorgente da quello destinatario e setta i condition codes in accordo con il risultato.. Condition codes: X N Z V C - * * * * CMPM Compare memory with memory Operation: [destination] - [source] Syntax: CMPM (Ay)+,(Ax)+ Attributes: Size = byte, word, longword Description: Subtract the source operand from the destination operand and set the condition codes accordingly. The destination is not modified by this instruction. The only permitted addressing mode is address register indirect with post-incrementing for both source and destination operands. Application: Used to compare the contents of two blocks of memory. Condition codes: X N Z V C - * * * * SUBQ Subtract quick Operation: [destination] ← [destination] - <literal> Syntax: SUBQ #<data>,<ea> Attributes: Size = byte, word, longword Description: Subtract the immediate data from the destination operand. The immediate data must be in the range 1 to 8. Word and longword operations on address registers do not affect condition codes. A word operation on an address register affects the entire 32-bit address. Condition codes: X N Z V C * * * * * Istruzione di salto (BRA instruction) BRA <label> Il controllo del programma passa direttamente alla istruzione individuata dalla label. L ampiezza del salto è limitata a -32768 to +32767. Esempio: loop <instruction> . . . BRA loop L’istruzione JMP Salto Condizionale (Conditional branching) L istruzione Bcc (branch on condition) Il salto viene eseguito in dipendenza dello stato dei flag nello status register (SR) X N Z V C status flags • Lo status Register è Sempre interessato dalla istruzione del programma appena eseguita Salto Condizionale (Conditional branching) L istruzione Bcc (branch on condition) cc - condition code CC carry clear CS carry set NE not equal C (salta se carry bit è clear, i.e. 0) C (salta se carry bit è settato, i.e. 1) Z (salta se zero bit è clear, i.e. 0) EQ equal Z (salta se zero bit è settato, i.e. 1) Salto Condizionale (Conditional branching) Altri condition codes PL plus N MI minus N GT greater than LE N ⋅V ⋅ Z + N ⋅V ⋅ Z less or equal Z + N ⋅ V + N ⋅ V Istruzioni di selezione in assembler – 1/2 Linguaggio di alto livello: if (espressione) istruzione istruzione_successiva NOTA: istruzione può essere un compound statement Linguaggio assembler (processore MC 68000): labelA B(NOT condizione) labelA istruzione ... istruzione_successiva Esempio: if (D0 == 5) D1++; D2 = D0; BNE SKIP CMPI.L #5,D0 SKIP ADDQ.L #1,D1 MOVE.L D0,D2 Istruzioni di selezione in assembler – 2/2 Linguaggio di alto livello: if (espressione) istruzione1 else istruzione2 istruzione_successiva Linguaggio assembler (processore MC 68000): B(NOT condizione) labelA istruzione1 ... BRA labelB labelA labelB istruzione2 ... istruzione_successiva Strutture iterative in assembler - 1/2 Linguaggio di alto livello: do istruzione while (condizione == TRUE); istruzione_successiva Linguaggio assembler (processore MC 68000): labelA istruzione ... Bcc labelA istruzione_successiva Esempio: calcola 3^N D0 = 1; D1 = 1; do { D0 = D0 * 3; D1++; } while (D1 <= N); (N>0) MOVE.B #N,D2 MOVE.B #1,D1 MOVE.W #1,D0 LOOP MULU.W #3,D0 ADDQ.B #1,D1 CMP.B D2,D1 BLE LOOP Strutture iterative in assembler - 2/2 Linguaggio di alto livello: while (condizione == TRUE) istruzione; istruzione_successiva Linguaggio assembler (processore MC 68000): BRA labelB labelA istruzione labelB Bcc labelA ... istruzione_successiva Esempio: calcola 3^N D0 = 1; D1 = 1; while (D1 <= N) { D0 = D0 * 3; D1++; }; (N>=0) LOOP TEST MOVE.B #N,D2 MOVE.B #1,D1 MOVE.W #1,D0 BRA TEST MULU.W #3,D0 ADDQ.B #1,D1 CMP.B D2,D1 BLE LOOP Decrement and Branch always (DBRA) DBRA equivale a DBF: caso particolare di DBcc con cc=FALSE Esempio: LOOP MOVE.L #N,D1 SUBQ.L #1,D1 MOVEA.L #NUM,A2 CLR.L D0 ADD.W (A2)+,D0 DBRA D1,LOOP MOVE.L D0,SOMMA equivale a: MOVE.L #N,D1 SUBQ.L #1,D1 MOVEA.L #NUM,A2 CLR.L D0 LOOP ADD.W (A2)+,D0 SUBQ #1,D1 BGE LOOP MOVE.L D0,SOMMA Esempio di generazione di codice assemblato PLC contenuto label 00000000 00002000 00002000 00002006 0000200C 00002012 00002018 0000201E 00002024 00002028 0000202A 00002030 00002030 00002032 00002034 00002034 4279 2032 3039 2034 33C0 2030 D079 2032 33C0 2032 3039 2030 0640 FFFF 66E2 4EF9 8008 =8008 =0011 0011 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 opcode operands * Un commento non fa incrementare il PLC ORG $2000 START CLR.W SUM Riferimento in avanti MOVE.W ICNT,D0 ALOOP MOVE.W D0,CNT ADD.W SUM,D0 MOVE.W D0,SUM MOVE.W CNT,D0 ADD.W #-1,D0 BNE ALOOP JMP SYSA SYSA EQU $8008 CNT DS.W 1 SUM DS.W 1 IVAL EQU 17 ICNT DC.W IVAL Symbol Table ALOOP START 200C 2000 CNT SUM comments 2030 2032 IVAL ICNT 0011 2034 Link ASIM • http://digilander.libero.it/rosario.cerbone/ Asim.htm Esempio esito del confronto $FF è maggiore di $10 se i numeri sono interpretati come unsigned, in quanto 255 è maggiore di 16 Tuttavia se i numeri sono interpretati come signed, $FF è minore di $10, in quanto -1 è minore di 16. IL PROCESSORE NON TIENE CONTO DEL TIPO DI RAPPRESENTAZIONE QUANDO SETTA I FLAG DI CONDIZIONE Esempio - Moltiplicazione di due interi * * Programma per moltiplicare MCND e MPY ORG * MULT $8000 CLR.W MOVE.W BEQ LOOP ADD.W parziale ADD.W BNE DONE MOVE.W D0 MPY,D1 DONE MCND,D0 D0 accumula il risultato D1 e' il contatatore di ciclo Se il contatore e' zero e' finito Aggiunge MCND al prodotto #-1,D1 LOOP D0,PROD Decrementa il contatore e ripete il giro Salva il risultato PROD PROD MPY MCND DS.W 1 Riserva spazio di memoria per DC.W DC.W 3 4 Definisce il valore di MPY Definisce il valore di MCND END MULT Fine ass., salto a entry point Esercitazione • Scrivere ed assemblare un programma che moltiplichi due interi • Eseguire il programma sul simulatore e sperimentare: – – – – – – – – – L effetto di DC e la rappresentazione esadecimale in memoria L effetto dell istruzione CLR su registro L effetto dell istruzione MOVE da memoria a registro L effetto dell istruzione BEQ sul PC L effetto dell istruzione ADD tra memoria e registro L effetto dell istruzione ADD tra immediato e registro L effetto dell istruzione BNE sul PC L effetto dell istruzione JMP sul PC L effetto dell istruzione MOVE da registro a memoria e la rappresentazione esadecimale in memoria Soluzione – mult2ints.a68 ORG MULT LOOP DONE PROD MPY MCND $8000 CLR.W MOVE.W BEQ ADD.W ADD.W BNE MOVE.W D0 MPY,D1 DONE MCND,D0 #-1,D1 LOOP D0,PROD D0 accumula il risultato D1 e' il contatatore di ciclo Se il contatore e' zero e' finito Aggiunge MCND al prodotto parziale Decrementa il contatore e ripete il giro Salva il risultato DS.W DC.W DC.W END 1 3 4 Riserva spazio di memoria per PROD Definisce il valore di MPY Definisce il valore di MCND Fine ass., salto a entry point MULT Soluzione - Assemblaggio 68kasm.exe -l filename.a68 o in alternativa: assembla.bat Soluzione - Esecuzione Esercitazione • Nell esempio precedente, effettuare le seguenti sostituzioni ed osservarne gli effetti DONE MOVE.W D0,PROD Salva il risultato PROD PROD DS.W 1 Riserva spazio di memoria per DONE MOVE.L D0,PROD Salva il risultato PROD PROD DS.L 1 Riserva spazio di memoria per Esempio - Somma di n interi START ALOOP CNT SUM IVAL ICNT CLR.W MOVE.W MOVE.W ADD.W MOVE.W MOVE.W ADD.W BNE SUM ICNT,D0 D0,CNT SUM,D0 D0,SUM CNT,D0 #-1,D0 ALOOP DS.W DS.W EQU DC.W END 1 1 17 IVAL START Esercitazione • Scrivere un programma che sommi i primi n interi • Assemblare ed eseguire il programma sul simulatore • Sperimentare: – – – – – – L L L L L L effetto dell istruzione CLR in memoria effetto dell istruzione MOVE da memoria a registro effetto dell istruzione ADD tra memoria e registro effetto delle varie istruzioni sui codici di condizione effetto dell istruzione BNE sul PC effetto dell istruzione JMP sul PC Soluzione - sumnnums.a68 START ALOOP SYSA CNT SUM IVAL ICNT CLR.W MOVE.W MOVE.W ADD.W MOVE.W MOVE.W ADD.W BNE JMP EQU DS.W DS.W EQU DC.W SUM ICNT,D0 D0,CNT SUM,D0 D0,SUM CNT,D0 #-1,D0 ALOOP SYSA $8008 1 1 17 IVAL Esercitazione • Scrivere un programma che esegua il prodotto scalare tra due vettori di interi • Assemblare ed eseguire il programma sul simulatore Soluzione – scalprod.a68 ORG START MOVE.L MOVE.L MOVE.L SUBQ CLR LOOP MOVE MULS ADD DBRA MOVE DONE JMP N EQU ORG A DC.W ORG B DC.W C DS.L $8000 #A,A0 #B,A1 #N,D0 #1,D0 D2 (A0)+,D1 (A1)+,D1 D1,D2 D0,LOOP D2,C DONE $000A $80B0 1,1,1,1,1,1,1,1,1,1 $80D0 1,1,1,1,1,1,1,1,1,1 1 Memoria – scalprod.a68 START = 8000 CODICE A = 80B0 VETTORE A B = 80D0 VETTORE B Esercitazione • Scrivere un programma che: – Riconosca un token in una stringa – Ne memorizzi l indirizzo in una locazione di memoria • Assemblare ed eseguire il programma sul simulatore Soluzione – token.a68 START LOOP FOUND ORG MOVEA.L MOVE.B CMP.B BNE SUBQ.L MOVE.L $8000 #STRING,A0 #TOKEN,D0 (A0)+,D0 LOOP #1,A0 A0,TOKENA ORG $8100 TOKEN EQU STRING DC.B TOKENA DS.L ':' 'QUI QUO:QUA' 1