Il 0% ha trovato utile questo documento (0 voti)
9 visualizzazioni36 pagine

(U2-02) Lucidi

Caricato da

giangimilano2020
Copyright
© © All Rights Reserved
Per noi i diritti sui contenuti sono una cosa seria. Se sospetti che questo contenuto sia tuo, rivendicalo qui.
Formati disponibili
Scarica in formato PDF, TXT o leggi online su Scribd
Il 0% ha trovato utile questo documento (0 voti)
9 visualizzazioni36 pagine

(U2-02) Lucidi

Caricato da

giangimilano2020
Copyright
© © All Rights Reserved
Per noi i diritti sui contenuti sono una cosa seria. Se sospetti che questo contenuto sia tuo, rivendicalo qui.
Formati disponibili
Scarica in formato PDF, TXT o leggi online su Scribd
Sei sulla pagina 1/ 36

Introduzione alla

programmazione Assembly

Corso di Calcolatori Elettronici I

Dipartimento di Informatica e Sistemistica


Università degli Studi di Napoli “Federico II”

DIS - Dipartimento di Informatica e Sistemistica- Università di Napoli


Sommario

¾ Programmazione del processore MC68000


• Modello di programmazione
• Alcuni codici e direttive
• Esempi ed esercizi

DIS - Dipartimento di Informatica e Sistemistica- Università di Napoli


Modello di programmazione del MC68000

31 16 15 8 7 0 Registri dati
D0
D1 utilizzabili come dati di
D2
D3 32 bit (Long Word), 16
D4 bit (Word) oppure 8 bit
D5
D6
(byte)
D7

A0 Registri indirizzo
A1
A2 utilizzabili per indirizzi
A3 di 32 bit (Long Word)
A4
A5 oppure 16 bit (Word)
A6
A7
Program counter
PC

X N Z V C SR
Registro di stato
T S I I I
2 1 0

DIS - Dipartimento di Informatica e Sistemistica- Università di Napoli


Registro di stato (Status register, SR)

¾ 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

DIS - Dipartimento di Informatica e Sistemistica- Università di Napoli


Istruzione MOVE

Operazione: [destination] <- [source]


Sintassi: MOVE <ea>,<e>
ad esempio: MOVE D2,D1
Attributi: Size = byte, word, longword

Descrizione:
Sposta il contenuto dell’operando sorgente nella locazione del secondo.
L’operando sorgente non è modificato. Influenza i flag di stato come
segue:
XNZVC
- * * 0 0
- ‘-’ : il flag non viene influenzato
- ‘*’ : il flag viene influenzato a seconda del risultato dell’operazione
- ‘0’ o ‘1’: il flag viene viene sempre posto pari a 0 o 1, rispettivamente

DIS - Dipartimento di Informatica e Sistemistica- Università di Napoli


Istruzione ADD

Operazione: [destination] <- [source] + [destination]


Sintassi: ADD <ea>,Dn (Dn: uno degli 8 registri dati D)
ADD Dn,<ea>
ad esempio: ADD D2,D1
Attributi: Size = byte, word, longword

Descrizione:
Somma l’operando sorgente con la destinazione, e memorizza il risultato
nella destinazione. Può influenzare tutti i flag di stato:
XNZVC
* * * * *

NOTA: esiste un’istruzione simile per la sottrazione (SUB)

DIS - Dipartimento di Informatica e Sistemistica- Università di Napoli


Istruzione ADDQ: “add quick”

Operation: [destination] ← [destination] + <literal>


Syntax: ADDQ #<data>,<ea>
Attributes: Size = byte, word, longword

Descrizione:
Somma l’immediato <literal> alla destinazione.
L’immediato può andare da 1 a 8.
L’operazione può influenzare tutti i flag di stato:

XNZVC
* * * * *
A differenza della ADD, l’immediato “corto” è codificato all’interno dei 16 bit
dell’istruzione e non separatamente in una successiva parola

NOTA: esiste un’istruzione simile per la sottrazione (SUBQ)

DIS - Dipartimento di Informatica e Sistemistica- Università di Napoli


Istruzione CLR: Clear

Operazione: [destination] <- 0


Sintassi: CLR <ea>
ad esempio: CLR D2
Attributi: Size = byte, word, longword

Descrizione:
Pone il valore 0 all’indirizzo <ea>. Influenza i flag di stato come segue:

XNZVC
- 0 1 0 0

DIS - Dipartimento di Informatica e Sistemistica- Università di Napoli


CMP: Compare

Operazione: [destination] - [source]


Sintassi: CMP <ea>,Dn
ad esempio: CMP (Test,A6,D3.W),D2
Attributi: Size = byte, word, longword

Descrizione:
Sottrae l’operando sorgente (source) dall’operando destinazione
(destination). NON memorizza il risultato: l’unico effetto è influenzare i
seguenti flag di stato sulla base del risultato:
XNZVC
- * * * *
Ad esempio, se i due operandi sono uguali, la sottrazione dà come risultato
zero, ed il flag Z viene posto ad 1. Il flag potrà poi essere letto da
un’istruzione successiva (ad esempio, una BEQ = salta se Z è 1), per
decidere quali istruzioni eseguire come conseguenza del confronto

DIS - Dipartimento di Informatica e Sistemistica- Università di Napoli


CMPM: Compare memory with memory

Operazione: [destination] - [source]


Sintassi: CMPM (Ay)+,(Ax)+
Attributi: Size = byte, word, longword

Descrizione:
Sottrae l’operando sorgente (source) dall’operando destinazione
(destination). NON memorizza il risultato, ma semplicemente influenza i
seguenti flag di stato sulla base del risultato:
XNZVC
- * * * *
L’unico modo di indirizzamento ammissibile è il post-incremento.
L’istruzione è usata per confrontare due array bi byte, word, o long

DIS - Dipartimento di Informatica e Sistemistica- Università di Napoli


Bcc: Branch on condition cc

Operazione: IF cc = 1 THEN [PC] ← [PC] + d


Sintassi: Bcc <label>
Attributi: uno spiazzamento (offset, o displacement)
di 8-bit o 16-bit.
Descrizione:
Se la condizione logica specificata dalla condizione cc è
verificata, non viene eseguita la prossima istruzione, bensì
quella avente indirizzo PC+spiazzamento.
Lo spiazzamento è in complementi a due e può pertanto essere
anche negativo (salto “indietro”)
cc indica una delle differenti condizioni che è possibile
riscontarare nel registro di stato come effetto delle istruzioni
precedenti (vedi seguito), ad esempio una compare (CMP)

DIS - Dipartimento di Informatica e Sistemistica- Università di Napoli


Bcc: possibili condizioni cc

¾ Single bit C, V, Z, N sono flag del


» BCS branch on carry set C=1 registro di stato
» BCC branch on carry clear C=0
» BVS branch on overflow set V=1 C = flag di carry
» BVC branch on overflow clear V=0
» BEQ branch on equal (zero) Z=1 V = flag di overflow
» BNE branch on not equal Z=0 Z = flag di zero
» BMI branch on minus (i.e., negative) N=1
» BPL branch on plus (i.e., positive) N=0 N = flag di negative
¾ Signed
» BLT branch on less than (zero) N⊕V=1
» BGE branch on greater than or equal N⊕V=0
» BLE branch on less than or equal (N ⊕ V) + Z = 1
» BGT branch on greater than (N ⊕ V) + Z = 0
¾ Unsigned
» BLS branch on lower than or same C+Z=1
» BHI branch on higher than C+Z=0

DIS - Dipartimento di Informatica e Sistemistica- Università di Napoli


Significato delle condizioni nella BRANCH

¾ Se i numeri sono interpretati come unsigned:

BHS BCC branch on higher than or same


BHI branch on higher than
BLS branch on lower than or same
BLO BCS branch on less than

¾ Se i numeri sono interpretati come signed

BGE branch on greater than or equal


BGT branch on greater than
BLE branch on lower than or equal
BLT branch on less than

DIS - Dipartimento di Informatica e Sistemistica- Università di Napoli


Differenza signed / unsigned nel confronto

Ad esempio:
¾ $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. Sta al programmatore
conoscere il formato dei dati manipolati ed interpretare
correttamente gli effetti sui flag di stato.

DIS - Dipartimento di Informatica e Sistemistica- Università di Napoli


Istruzione di salto incondizionato JMP

Operazione: [PC] <- destination


Sintassi: JMP <ea>
ad esempio: JMP loop3
Attributi: --

Descrizione:
Scrive il valore dell’operando destinazione nel Program Counter: in altre
parole, realizza un salto incondizionato. Prevede differenti modi di
indirizzamento per specificare l’operando destinazione (a differenza della
Branch che prevede solo indirizzamento relativo). Non influenza i flag di
stato:
XNZVC
- - - - -

DIS - Dipartimento di Informatica e Sistemistica- Università di Napoli


DBcc: Test condition, decrement, and branch

Operazione: IF (cc false) THEN


[Dn] ← [Dn] – 1
IF [Dn] = -1 THEN [PC] ← [PC] + 2
ELSE [PC] ← [PC] + d
ELSE [PC] ← [PC] + 2
Sintassi: DBcc Dn,<label>
Attributi: Size = word

Descrizione:
Fintantoché la condizione cc rimane falsa, decrementa il registro Dn, e se questo non
era zero prima del decremento (ovvero se non vale -1) salta all’istruzione a
distanza d. Negli altri casi, passa all’istruzione seguente.
Fornisce un modo sintetico per gestire i cicli, sostituendo con un’unica istruzione il
decremento di un registro di conteggio e la verifica di una condizione normalmente
fatti con istruzioni separate.
Supporta tutti i cc usati in Bcc. Inoltre, ammette anche le forme DBF e DBT (F = false,
e T = true) per ignorare la condizione ed usare solo il registro di conteggio.

DIS - Dipartimento di Informatica e Sistemistica- Università di Napoli


LEA: Load Effective Address

Operazione: [An] ← <ea>


Sintassi: LEA <ea>,An
Esempio: LEA table,A3
Attributi: Size = longword

Descrizione:
Calcola l’indirizzo effettivo (<ea>) del primo operando,
generalmente espresso in forma simbolica, e lo pone nel
registro indirizzo specificato dal suo secondo operando. Non
influenza i flag di stato:
XNZVC
- - - - -

DIS - Dipartimento di Informatica e Sistemistica- Università di Napoli


Pseudo-operatori

¾ NON sono istruzioni eseguite dal processore


» sono direttive che regolano il processo di traduzione del programma
assembler in programma eseguibile

¾ Lo pseudo-operatore ORG
» Viene usato per inizializzare il Program Location Counter (PLC),
ovvero per indicare a quale indirizzo sarà posta la successiva sezione
di codice o dati
» Esempio: ORG $8100
¾ Lo pseudo-operatore END
» Viene usato per terminare il processo di assemblaggio ed impostare
l’entry point (prima istruzione da eseguire) nel programma
» Esempio: END TARGETLAB

DIS - Dipartimento di Informatica e Sistemistica- Università di Napoli


Pseudo-operatori

¾ Lo pseudo-operatore DS
» Viene usato per incrementare il Program Location Counter (PLC), in
modo da riservare spazio di memoria per una variabile
» Esempio: LABEL DS.W NUMSKIPS

¾ Lo pseudo-operatore DC
» Viene usato per inizializzare il valore di una variabile
» Esempio: LABEL DC.W VALUE

¾ Lo pseudo-operatore EQU
» Viene usato per definire una costante usata nel sorgente assembler
» Esempio: LABEL EQU VALUE

DIS - Dipartimento di Informatica e Sistemistica- Università di Napoli


Etichette (label)

¾ Sono stringhe di testo arbitrarie (opzionali) anteposte ad una istruzione o


ad un dato all’interno del programma assembler
¾ Servono a riferirsi al particolare indirizzo che contiene quella istruzione o
dato
» usati per gestire i salti
» usati per gestire variabili (manipolate nel programma assembler attraverso le
loro etichette in maniera simile alle variabili di un linguaggio di
programmazione di alto livello)
¾ Ad esempio:
» ALOOP è un’etichetta usata per riferisti all’istruzione MOVE, SUM è una
etichetta usata per gestire una variabile, mentre IVAL è una costante

ALOOP MOVE.W D0,CNT


ADD.W SUM,D0
… … … …
SUM DS.W 1
IVAL EQU 17
… … … … … …

DIS - Dipartimento di Informatica e Sistemistica- Università di Napoli


Esempio di programma assembler 68000
PLC contenuto label opcode operands comments
00000000 1 * Programma per sommare i primi 17 interi
00000000 2 *
00008000 3 ORG $8000
00008000 4279 00008032 4 START CLR.W SUM
00008006 3039 00008034 5 MOVE.W ICNT,D0
0000800C 33C0 00008030 6 ALOOP MOVE.W D0,CNT
00008012 D079 00008032 7 ADD.W SUM,D0
00008018 33C0 00008032 8 MOVE.W D0,SUM
0000801E 3039 00008030 9 MOVE.W CNT,D0
00008024 0640 FFFF 10 ADD.W #-1,D0
00008028 66E2 11 BNE ALOOP
0000802A 4EF9 00008008 12 JMP SYSA
00008030 =00008008 13 SYSA EQU $8008
00008030 14 CNT DS.W 1
00008032 15 SUM DS.W 1
00008034 =00000011 16 IVAL EQU 17
00008034 0011 17 ICNT DC.W IVAL

Symbol Table
ALOOP 800C CNT 8030 IVAL 0011
START 8000 SUM 8032 ICNT 8034
DIS - Dipartimento di Informatica e Sistemistica- Università di Napoli
Programma assemblato in memoria

DIS - Dipartimento di Informatica e Sistemistica- Università di Napoli


Esempio - Moltiplicazione di due interi

* Programma per moltiplicare MCND e MPY


*
ORG $8000
*
MULT CLR.W D0 D0 accumula il risultato
MOVE.W MPY,D1 D1 e' il contatatore di ciclo
BEQ DONE Se il contatore e' zero e' finito
LOOP ADD.W MCND,D0 Aggiunge MCND al prodotto parziale
ADD.W #-1,D1 Decrementa il contatore
BNE LOOP e ripete il giro
DONE MOVE.W D0,PROD Salva il risultato

PROD DS.W 1 Riserva spazio di memoria per PROD


MPY DC.W 3 Definisce il valore di MPY
MCND DC.W 4 Definisce il valore di MCND
END MULT Fine ass., salto a entry point

DIS - Dipartimento di Informatica e Sistemistica- Università di Napoli


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

DIS - Dipartimento di Informatica e Sistemistica- Università di Napoli


Soluzione – mult2ints.a68

ORG $8000

MULT CLR.W D0 D0 accumula il risultato


MOVE.W MPY,D1 D1 e' il contatatore di ciclo
BEQ DONE Se il contatore e' zero e' finito
LOOP ADD.W MCND,D0 Aggiunge MCND al prodotto parziale
ADD.W #-1,D1 Decrementa il contatore
BNE LOOP e ripete il giro
DONE MOVE.W D0,PROD Salva il risultato

PROD DS.W 1 Riserva spazio di memoria per PROD


MPY DC.W 3 Definisce il valore di MPY
MCND DC.W 4 Definisce il valore di MCND
END MULT Fine ass., salto a entry point

DIS - Dipartimento di Informatica e Sistemistica- Università di Napoli


Soluzione - Assemblaggio

¾ Per assemblare il sorgente assembly visto prima, è


possibile usare il programma AsimTool, che fornisce
un’interfaccia grafica,
¾ oppure digitare da linea di comando:

68kasm.exe -l filename.a68

DIS - Dipartimento di Informatica e Sistemistica- Università di Napoli


Soluzione - Esecuzione

Per avviare il
programma, occorre
che il Program Counter
(PC) contenga
l’indirizzo della prima
istruzione. Nel
programma, tale
indirizzo è determinato
dalla direttiva
ORG $8000
Il Program Counter può
essere settato a mano
dal menù Proc_Unit /
Modify Register

DIS - Dipartimento di Informatica e Sistemistica- Università di Napoli


Esercitazione

¾ Nell’esempio precedente, effettuare le seguenti sostituzioni ed


osservarne gli effetti

DONE MOVE.W D0,PROD Salva il risultato

PROD DS.W 1 Riserva spazio di memoria per PROD

DONE MOVE.L D0,PROD Salva il risultato

PROD DS.L 1 Riserva spazio di memoria per PROD

L= long (32 bit) W= word (16 bit) B= byte (8 bit)


DIS - Dipartimento di Informatica e Sistemistica- Università di Napoli
Esempio - Somma di n interi
START CLR.W SUM
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

CNT DS.W 1
SUM DS.W 1
IVAL EQU 17
ICNT DC.W IVAL
END START

DIS - Dipartimento di Informatica e Sistemistica- Università di Napoli


Esercitazione

¾ Scrivere un programma che sommi i primi n interi


¾ Assemblare ed eseguire il programma sul simulatore
¾ Sperimentare:
» L’effetto dell’istruzione CLR in memoria
» L’effetto dell’istruzione MOVE da memoria a registro
» L’effetto dell’istruzione ADD tra memoria e registro
» L’effetto delle varie istruzioni sui codici di condizione
» L’effetto dell’istruzione BNE sul PC
» L’effetto dell’istruzione JMP sul PC

DIS - Dipartimento di Informatica e Sistemistica- Università di Napoli


Soluzione - sumnnums.a68
START CLR.W SUM
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
DIS - Dipartimento di Informatica e Sistemistica- Università di Napoli
Esercitazione

¾ Scrivere un programma che esegua il prodotto scalare


tra due vettori di interi
¾ Assemblare ed eseguire il programma sul simulatore

DIS - Dipartimento di Informatica e Sistemistica- Università di Napoli


Soluzione – scalprod.a68
ORG $8000
START MOVE.L #A,A0 Mappa della memoria:
MOVE.L #B,A1
MOVE.L #N,D0 START = 8000 CODICE
SUBQ #1,D0
CLR D2
LOOP MOVE (A0)+,D1 A = 80B0 VETTORE A
MULS (A1)+,D1
ADD D1,D2
DBRA D0,LOOP B = 80D0 VETTORE B
MOVE D2,C
DONE JMP DONE
N EQU $000A
ORG $80B0
A DC.W 1,1,1,1,1,1,1,1,1,1
ORG $80D0
B DC.W 1,1,1,1,1,1,1,1,1,1
C DS.L 1
DIS - Dipartimento di Informatica e Sistemistica- Università di Napoli
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

DIS - Dipartimento di Informatica e Sistemistica- Università di Napoli


Soluzione – token.a68

ORG $8000
START MOVEA.L #STRING,A0
MOVE.B #TOKEN,D0
LOOP CMP.B(A0)+,D0
BNE LOOP
FOUND SUBQ.L #1,A0
MOVE.L A0,TOKENA

ORG $8100
TOKEN EQU ':'
STRING DC.B 'QUI QUO:QUA'
TOKENA DS.L 1

DIS - Dipartimento di Informatica e Sistemistica- Università di Napoli


Soluzione – token.a68

ORG $8000
ATTENZIONE:
START MOVEA.L #STRING,A0
In questo semplice
MOVE.B #TOKEN,D0 programma, si assume
LOOP CMP.B(A0)+,D0 che la stringa contenga
sempre il token. Se non è
BNE LOOP così, il ciclo continua
FOUND SUBQ.L #1,A0 all’infinito. In un
programma realmente
MOVE.L A0,TOKENA utilizzabile occorrerebbe
anche controllare se si è
arrivati alla fine della
ORG $8100 stringa prima di ogni
TOKEN EQU ':' iterazione

STRING DC.B 'QUI QUO:QUA'


TOKENA DS.L 1

DIS - Dipartimento di Informatica e Sistemistica- Università di Napoli

Potrebbero piacerti anche