Introduzione alla programmazione assembly - ICAR-CNR

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