Nell'istruzione somma (ADD)
a 8 bit l'accumulatore A è sempre usato come primo operando e
come destinazione del risultato, mentre il secondo operando
può essere:
a) un valore immediato a 8 bit;
b) il contenuto di un registro a 8 bit;
c) il contenuto di una locazione di memoria, specificata con
indirizzamento indiretto tramite
HL, o i registri indice IX o IY.
Vediamo alcuni esempi:
Al termine della ADD, se la somma ha generato un riporto, viene posto a 1 il flag carry del registro dei flag.
Una variante importante dell'istruzione di somma è la ADC (somma con riporto):
Questa istruzione è come la precedente, solo che in
questo caso la ADC
tiene conto, nel fare il
calcolo, anche del riporto eventualmente già presente nel flag di
carry del registro dei flag. In altre parole, somma al
registro
accumulatore A la sorgente s, più 1 se nel flag di carry
abbiamo memorizzato un riporto e rimette il risultato in A.
L'aritmetica a 16 bit dello Z80 è piuttosto limitata e comprende solo alcune operazioni. Nel caso della somma a 16 bit, il primo operando e la destinazione dell'operazione sono il registro accoppiato HL oppure i registri indice IX o IY. Il secondo operando può essere soltanto un registro interno a 16 bit. Le combinazioni possibili sono le seguenti:
Si noti che non si tratta di vere operazioni a 16 bit, perché l'ALU è da 8 bit: l'operazione è scomposta internamente in due fasi successive, prima sul byte "basso" e poi sul byte "alto", ma dall'esterno questo dettaglio non e` osservabile dall'esterno (se non nel tempo richiesto per effettuare l'operazione).
L'istruzione che effettua la sottrazione è la SUB. In questo caso, siccome il primo operando è sempre l'accumulatore (a differenza della ADD, che nella versione a 16 bit può avere un primo operando diverso dall'accumulatore), il primo operando viene sempre sottinteso (indirizzamento implicito).
Abbiamo le seguenti possibilità:
Al termine, se la sottrazione ha richiesto un prestito, viene posto a uno il flag di riporto carry (che viene usato anche come prestito, borrow).
Anche in questo caso abbiamo la variante "con il prestito in ingresso", la SBC:
L'unica istruzione di sottrazione a 16 bit è la sottrazione con riporto SBC con primo operando e destinazione del risultato HL:
L'istruzione CP (compare) è molto utilizzata per fare il confronto l'accumulatore A e un operando. In pratica l'istruzione effettua una sottrazione fra l'accumulatore e l'operando senza però salvare il risultato. Lo scopo della sottrazione è semplicemente quello di cambiare il valore dei flag del registro dei flag a seconda del risultato della sottrazione. Le possibilità sono (i valori numerici sono solo degli esempi):
Al termine dell'istruzione gli operandi, compreso quello contenuto nell'accumulatore, rimangono invariati. L'informazione utile, cioè il risultato del confronto (p.e. "A è maggiore di 2Ah") è invece memorizzata nei flag denominati Carry, Zero e Sign, secondo la seguente tabella (s indica il secondo operando):
Risultato | Carry | Zero | Sign |
A>s | 0 | 0 | 0 |
A = s | 0 | 1 | 0 |
A<s | 1 | 0 | 1 |
Sign è significativo nel caso di confronto tra
numeri con
segno in complemento a due. Nel caso
di confronto tra numeri a 8 bit senza segno, sono importanti i flag di
Carry e di Zero. Più avanti, esaminando le istruzioni di
salto
condizionato, capiremo come i flag
rivestono una grande importanza nella programmazione assembly.
Le istruzioni di incremento (INC) e di decremento (DEC) operano su un registro oppure su una locazione di memoria, ottenuta per indirizzamento indiretto (HL) o indice (IX o IY), incrementandone o decrementandone il valore di una unità.
I casi possibili sono i seguenti (per semplicità viene considerata solo l'istruzione INC, essendo la DEC perfettamente analoga):
L'incremento o decremento è sempre di una
unità, e l'operazione influenza i flag di Zero e di
Sign, ma non quello di Carry. Le operazioni di incremento e decremento
sono cicliche, cioè raggiunto il massimo valore (FFh) un
ulteriore incremento fa ricominciare il conteggio da zero (viceversa
per l'operazione DEC).
Ci sono anche istruzioni di incremento e decremento a 16 bit. Le possibilità sono le seguenti (vengono forniti solo gli esempi con la DEC essendo la INC perfettamente analoga):
Attenzione: purtroppo le operazioni di incremento e decremento a 16 bit, per ragioni di realizzazione hardware, non influenzano i flag, contrariamente al normale buon senso, e di questo ne dovremo tenere conto in seguito, al momento di scrivere programmi.
Lo Z80, a differenza di altri microprocessori più moderni, non dispone di nessuna istruzione per effettuare la moltiplicazione. Dunque il prodotto può solo essere calcolato per mezzo di un programma (trasformandolo in una sequenza di somme).
Sito realizzato in base al
template offerto da
http://www.graphixmania.it