Sommario
I
registri A F BC DE HL sono
duplicati in un set di registri alternativo commutabile con le
istruzioni EX AF,AF' e EXX. Il
registro B viene anche usato
come contatore a 8 bit nell'istruzione DJNZ. Il registro HL viene anche usato come accumulatore nelle operazioni a 16 bit. I
registri HL DE BC vengono
usati insieme nelle istruzioni sui blocchi di dati.
Nel
codice assembly un valore costante può essere scritto in
decimale, binario o esadecimale,
e può rappresentare a seconda dell'istruzione un indirizzo di memoria,
un bit, un offset o un valore immediato da assegnare ad un registro o
con cui effettuare un'operazione logica/aritmetica. Le label possono indicare dei valori costanti (specificati con .equ), o degli indirizzi di memoria di istruzioni (o blocchi di dati), quando sono scritte in corrispondenza di essi. Generalmente la sintassi HL indica il valore a 16 bit del registro HL, mentre la sintassi (HL) indica il byte contenuto all'indirizzo di memoria specificato dal valore di HL. Generalmente Ia sintassi (12000) indica il byte contenuto all'indirizzo di memoria 12000, mentre la sintassi (label) indica il byte contenuto all'indirizzo di memoria specificato dal valore della label. In
memoria i dati a 16 bit vengono sempre scritti prima byte basso e poi
byte alto, quindi LD (12000),HL scrive in (12000) il valore di L e in
(12001) il valore di H.
JR label e JP label sono i salti incondizionati: relativo corto il primo (da -128 a +127 byte rispetto all'indirizzo di inizio dell'istruzione successiva) e assoluto il secondo (da 0 a 65535). Scrivendo delle label come punti di arrivo dei salti, l'assemblatore calcola automaticamente i valori numerici dei salti. I salti possono essere
condizionati dallo stato dei flags:
L'istruzione CP effettua un confronto a 8 bit (sottrazione) tra A e l'operando specificato, ad esempio CP A,12 effettua la sottrazione A-12 (senza alterare il valore di A). L'operazione imposta i
flags in accordo con il risultato: il bit Z viene settato se il
risultato della sottrazione è zero, il bit C (flag carry CF da non
confondere con il registro C) viene settato se si è avuto un prestito,
il bit di segno viene impostato in base al valore del bit 7 del risultato (negativo se bit 7=1). Controllando lo stato dei flags dopo un'operazione di confronto (o una qualsiasi sottrazione) si può quindi stabilire la relazione tra i due valori:
Per i soli test > e <=, è possibile scambiare gli operandi durante il confronto e ridurre ad uno solo il flag da controllare: LD B,A ;salva A in B
Con SBC HL,registro_16_bit è possibile confrontare il valore a 16 bit di HL con quello di un altro registro generale a 16 bit (DE BC), però bisogna prima azzerare il flag C di riporto/prestito, ed eventualmente salvarsi da qualche parte il vecchio valore di HL perchè questa sottrazione ne altera il valore (in HL viene messo il risultato della sottrazione): AND A ;azzera flag CF
DJNZ label decrementa B e salta a label se B<>0. Il valore di B può andare da 0 a 255, se vale 0 DJNZ effettua 256 cicli. DJNZ effettua un salto
relativo corto come JR da -128 a +127 byte rispetto
all'indirizzo di inizio dell'istruzione successiva. CALL label salva nello stack l'indirizzo della prossima istruzione e salta all'indirizzo assoluto specificato da label (da 0 a 65535). RET ritorna da una subroutine recuperando l'indirizzo di ritorno dallo stack. Chiamate e ritorni da
subroutines possono essere condizionate dallo stato dei flags
esattamente come i salti (ad esempio CALL
C o RET NZ). Queste istruzioni servono per spostare o effettuare ricerche in blocchi di byte, coinvolgono i registri HL e DE come indici sorgente/destinazione a 16 bit, e BC come contatore a 16 bit. LDI ;(HL)->(DE) HL+1 DE+1 BC-1CPI e CPD confrontano A con il valore in (HL) impostando i flag come con una operazione CP, poi incrementano (o decrementano) HL e decrementano BC. CPIR e CPDR confrontano A con (HL) al massimo per BC volte, la ricerca si arresta quando BC=0 o quando il flag Z=1 (trovato valore corrispondente e HL punta all'elemento successivo). All'accensione il valore di SP
viene impostato a zero. Considerando che lo stack si estende verso
indirizzi più bassi, e che SP viene prima decrementato e poi usato per
indirizzare la memoria, il primo dato a 16 bit salvato nello stack
verrebbe scritto agli indirizzi 65534:65535. Se questi indirizzi non
sono adatti al sistema in uso, prima di usare lo stack il valore di SP
va regolato in modo da puntare ad un'area di memoria valida. E' possibile allocare dello spazio sullo stack spostandolo verso indirizzi più bassi, e successivamente liberare lo spazio : LD IX,-16 ;16 byte da allocare I registri alternativi permettono di evitare o ridurre l'uso della memoria per salvare temporaneamente i valori dei registri generali. La commutazione tra i due banchi è una delle operazioni più veloci. EX AF,AF' ;scambia A F con A' F'
EX AF,AF' Esempio, appoggiandosi allo stack è possibile passare valori tra i registri di un set e quelli dell'altro: PUSH DE Esempio, lavorare con i registri alternativi ma ritornare il valore di A: EXX AF,AF' Pagina realizzata da Claudio Fin Ultimo aggiornamento 5-5-2013 |