Intel 8051: differenze tra le versioni
Contenuto cancellato Contenuto aggiunto
|  il nome corretto della versione potenziata dall'8052 è 8752, non 8072 | Nessun oggetto della modifica | ||
| Riga 40: == Programmazione == Oltre alla programmazione in linguaggio [[assembler]] nativo, sono disponibili diversi [[compilatore|compilatori]] [[C (linguaggio di programmazione)|C]], completi di estensioni per il controllo dell'allocazione delle variabili nei vari tipi di memoria e per l'accesso alle caratteristiche hardware specifiche dell'8051, come ad esempio i banchi di registri per le variabili a singolo bit. Sono inoltre disponibili compilatori e interpreti di altri linguaggi di alto livello come: [[Forth]], [[BASIC]], [[Pascal (linguaggio)|Pascal]]/[[Object Pascal]], [[PL/M]] e [[Modula 2]]. ==Instruction set== '''Arithmetic Operations''' {| class="wikitable" border="1" |- ! Mnemonici ! Descrizione ! Bytes ! Cicli |- | ADD A,Rn | Somma ad A il contenuto del registro Rn | 1 | 1 |- | ADD A,direct	 | Somma ad A il contenuto della locazione direct | 2 | 1 |- | ADD A,@Ri	 | Somma ad A il contenuto della locazione puntata da Ri | 1	 | 1 |- | ADD A,#data	 | Somma ad A il dato immediato	 | 2 | 1 |- | ADDC A,Rn	 | Somma ad A il contenuto del registro Rn e il CY	 | 1 | 1 |- | ADDC A,direct	 | Somma ad A il contenuto della locazione direct e il CY	 | 2 | 1 |- | ADDC A,@Ri	 | Somma ad A il contenuto della locazione puntata da Ri e il CY	 | 1 | 	1 |- | ADDC A,#data	 | Somma ad A il dato immediato e il CY	 | 2 | 	1 |- | SUBB A,Rn	 | Sottrae da A il contenuto del registro Rn e il CY | 1 | 	1 |- | SUBB A,direct	 | Sottrae da A il contenuto della locazione direct e il CY	 | 2 | 	1 |- | SUBB A,@Ri	 | Sottrae da A il contenuto della locazione puntata da Ri e il CY	 | 1 | 	1 |- | SUBB A,#data	 | Sottrae da A il dato immediato e il CY	 | 2 | 	1 |- | INC A	 | Aumenta di 1 il contenuto di A | 1 | 	1 |- | INC Rn	 | Aumenta di 1 il contenuto del registro Rn	 | 1 | 	1 |- | INC direct	 | Aumenta di 1 il contenuto della locazione direct	 | 2 | 	1 |- | INC @Ri	 | Aumenta di 1 il contenuto della locaz. puntata da Ri	 | 1 | 	1 |- | DEC A	 | Diminuisce di 1 il contenuto di A | 1 | 	1 |- | DEC Rn	 | Diminuisce di 1 il contenuto del registro Rn	 | 1 | 	1 |- | DEC direct	 | Diminuisce dI 1 il contenuto della locazione direct | 2 | 	1 |- | DEC @Ri	 | Diminuisce di 1 il contenuto della locaz. puntata da Ri	 | 1 | 	1 |- | INC DPTR	 | Aumenta di 1 il contenuto del registro DPTR	 | 1 | 	2 |- | MUL AB	 | Moltiplica il contenuto di A per quello di B; la parte bassa del risultato va in A e la parte alta va in B	 | 1 | 	4 |- | DIV AB	 | Divide il contenuto di A per B; il quoziente va in A e il resto in B	 | 1	 | 4 |- | DA A	 | Realizza l'aggiustamento decimale del contenuto di A. Utilizzando la rappresentazione in BCD le istruzioni ADD e ADDC debbono essere seguite da DA: ciò assicura che il risultato sia ancora in BCD	 | 1 | 	1 |} '''Operazioni Logiche''' {| class="wikitable" border="1" |- ! Mnemonici ! Descrizione ! Bytes ! Cicli |- | ANL A,Rn | AND logico tra A e il contenuto del registro Rn | 1 | 1 |- | ANL A,direct | AND logico tra A e il contenuto della locazione direct | 2 | 1 |- | ANL A,@Ri | AND logico tra A e il contenuto della locazione puntata da Ri | 1 | 1 |- | ANL A,#data | AND logico tra A e il dato immediato | 2 | 1 |- | ANL direct,A | AND logico tra il contenuto della locazione direct e dell'ACC; il risultato rimane nella locazione direct | 2 | 1 |- | ANL direct,#data | AND logico tra il contenuto della locazione direct ed il dato; il risultato rimane nella locazione direct | 3 | 2 |- | ORL A,Rn | OR logico tra A e il contenuto del registro Rn | 1 | 1 |- | ORL A,direct | OR logico tra A e il contenuto della locazione direct | 2 | 1 |- | ORL A,@Ri | OR logico tra A e il contenuto della locazione puntata da Ri | 1 | 1 |- | ORL A,#data | OR logico tra A e il dato immediato | 2 | 1 |- | ORL direct,A | OR logico tra il contenuto della locazione direct e dell'ACC; il risultato rimane nella locazione direct | 2 | 1 |- | ORL direct,#data | OR logico tra il contenuto della locazione direct ed il dato immediato; il risultato rimane nella locazione direct | 3 | 2 |- | XRL A,Rn | EX-OR logico tra A e il contenuto del registro Rn | 1 | 1 |- | XRL A,direct | EX-OR logico tra A e il contenuto della locazione direct | 2 | 1 |- | XRL A,@Ri | EX-OR logico tra A e il contenuto della locazione puntata da Ri | 1 | 1 |- | XRL A,#data | EX-OR logico tra A e il dato immediato | 2 | 1 |- | XRL direct A | EX-OR logico tra il contenuto della locazione direct e A, il risultato rimane nella locazione direct | 2 | 1 |- | XRL direct,#data | EX-OR logico tra il contenuto della locazione direct e il dato, il risultato rimane nella locazione direct | 3 | 2 |- | CLR A | Azzera tutti i bit di A | 1 | 1 |- | CPL A | Complementa a 1 (ovvero inverte) tutti i bit di A | 1 | 1 |- | RL A | Ruota di un posto verso sinistra i bit di A | 1 | 1 |- | RLC A | Ruota di un posto verso sinistra i bit di A con riporto al CY | 1 | 1 |- | RR A | Ruota di un posto verso destra i bit di A | 1 | 1 |- | RRC A | Ruota di un posto verso destra i bit di A con riporto al CY | 1 | 1 |- | SWAP A | scambia i due nibble dell’accumulatore | 1 | 1 |} '''Operazioni di Trasferimento Dati''' {| class="wikitable" border="1" |- ! Mnemonic ! Description ! Bytes ! Cycles |- | MOV A,Rn | Copia in A il contenuto del registro Rn | 1 | 1 |- | MOV A,direct | Copia in A il contenuto della locazione direct | 2 | 1 |- | MOV A,@Ri | Copia in A il contenuto della locazione puntata da Ri | 1 | 1 |- | MOV A,#data | Copia in A il dato immediato | 2 | 1 |- | MOV Rn,A | Copia nel registro Rn il contenuto di A | 1 | 1 |- | MOV Rn,direct | Copia nel registro Rn il contenuto della locazione direct | 2 | 2 |- | MOV Rn,#data | Copia nel registro Rn il dato immediato | 2 | 1 |- | MOV direct,A | Copia nella locazione direct il contenuto di A | 2 | 1 |- | MOV direct,Rn | Copia nella locazione direct il contenuto del registro Rn | 2 | 2 |- | MOV direct,direct | Copia nella locazione direct il contenuto della locazione direct | 3 | 2 |- | MOV direct,@Ri | Copia nella locazione direct il contenuto della locazione puntata da Ri | 2 | 2 |- | MOV direct,#data | Copia nella locazione direct il dato immediato | 3 | 2 |- | MOV @Ri,A | Copia nella locazione puntata da Ri il contenuto di A | 1 | 1 |- | MOV @Ri,direct | Copia nella locazione puntata da Ri il contenuto. della locazione direct | 2 | 2 |- | MOV @Ri,#data | Copia nella locazione puntata da Ri il dato immediato | 2 | 1 |- | MOV DPTR,#data16 | Copia in DPTR un dato a 16 bit | 2 | 1 |- | MOVC A,@A+DPTR | Copia in A il contenuto della memoria programma di indirizzo DPTR + A | 1 | 2 |- | MOVC A,@A+PC | Copia in A il contenuto della memoria programma di indirizzo PC + A +1 | 1 | 2 |- | MOVX A,@Ri | Copia in A il contenuto della memoria dati esterna puntata da Ri | 1 | 2 |- | MOVX A,@DPTR | Copia in A il contenuto della memoria dati esterna puntata da DPTR | 1 | 2 |- | MOVX @Ri,A | Copia nella locazione di memoria dati esterna puntata da Ri il contenuto di A | 1 | 2 |- | MOVX @DPTR,A | Copia nella locazione di memoria dati esterna puntata da DPTR il contenuto di A | 1 | 2 |- | PUSH direct | Copia nella locazione puntata da SP il contenuto della locazione direct e aumentalo Stack di una unità | 2 | 2 |- | POP direct | Copia nella locazione direct il contenuto della locazione puntata da SP e diminuisce lo Stack di una unità | 2 | 2 |- | XCH A,Rn | Scambia il contenuto di A con quello di Rn | 1 | 1 |- | XCH A,direct | Scambia il contenuto di A con quello della locazione direct | 2 | 1 |- | XCH A,@Ri | Scambia il contenuto di A con quello della locazione puntata da Ri | 1 | 1 |- | XCHD A,@Ri | Scambia il nibble meno significativo di A con il più significativo della locazione puntata da Ri | 1 | 1 |} '''Single Bit (Boolean Variable) Operations''' {| class="wikitable" border="1" |- ! Mnemonici ! Descrizione ! Bytes ! Cicli |- | CLR C | Azzera il flag CY | 1 | 1 |- | CLR bit | Azzera il bit dell’indirizzo [bit] | 2 | 1 |- | SETB C | Pone a 1 il flag CY | 1 | 1 |- | SETB bit | Pone a 1 il bit dell’indirizzo [bit] | 2 | 1 |- | CPL C | Inverte il flag CY | 1 | 1 |- | CPL bit | Inverte il bit dell’indirizzo [bit] | 2 | 1 |- | ANL C,bit | AND logico fra CY e il bit dell’indirizzo [bit] | 2 | 2 |- | ANL C,/bit | AND logico fra CY e la negazione del bit dell’indirizzo [bit] | 2 | 2 |- | ORL C,bit | OR logico fra CY e il bit dell’indirizzo [bit] | 2 | 2 |- | ORL C,/bit | OR logico fra CY e la negazione del bit dell’indirizzo [bit] | 2 | 2 |- | MOV C,bit | Copia nel carry il bit di indirizzo bit | 2 | 1 |- | MOV bit,C | Copia il carry nell'indirizzo bit | 2 | 2 |} '''Istruzioni di controllo''' {| class="wikitable" border="1" |- ! Mnemonici ! Descrizione ! Bytes ! Cicli |- | ACALL addr11 | Manda in esecuzione una routine entro un segmento da 2K (solo in avanti) | 2 | 2 |- | LCALL addr16 | Manda in esecuzione una routine (anche fuori segmento, fino a ±32K) | 3 | 2 |- | RET | Termina l’esecuzione di una routine | 1 | 2 |- | RETI | Termina l’esecuzione della routine di risposta ad un’interruzione | 1 | 2 |- | AJMP addr11 | Salta all’indirizzo specificato entro un segmento da 2K (solo in avanti) | 2 | 2 |- | LJMP addr16 | Salta all’indirizzo specificato (anche fuori segmento, fino a ±32K) | 3 | 2 |- | SJMP rel | Salta a [rel] posizioni successive del Program Counter (entro –128 e +127) | 2 | 2 |- | JMP @A+DPTR | Salta alla locazione di PC puntata da A + il contenuto del DPTR | 1 | 2 |- | JZ rel | Salta alla locazione [rel] se il contenuto di A è uguale a zero | 2 | 2 |- | JNZ rel | Salta alla locazione [rel] se il contenuto di A è diverso da zero | 2 | 2 |- | JC rel  | Salta alla locazione [rel] se il bit di CY vale 1 | 2 | 2 |- | JNC rel | Salta alla locazione [rel] se il bit di CY vale 0 | 2 | 2 |- | JB bit,rel | Salta alla locazione [rel] se il bit contenuto nell’indirizzo [bit] vale 1 | 3 | 2 |- | JNB bit,rel | Salta alla locazione [rel] se il bit contenuto nell’indirizzo [bit] vale 0 | 3 | 2 |- | JBC bit,rel | Salta alla locazione [rel] se il bit contenuto nell’indirizzo [bit] vale 1, e poi lo azzera | 3 | 2 |- | CJNE A,direct,rel | Salta alla locazione [rel] se il contenuto di A è diverso da quello di [direct]; se A è minore di [direct] pone CY=1, altrimenti CY=0 | 3 | 2 |- | CJNE A,#data,rel | Salta alla locazione [rel] se il contenuto di A è diverso dal dato immediato; se A è minore di #dato pone CY=1, altrimenti CY=0 | 3 | 2 |- | CJNE Rn,#data,rel | Salta alla locazione [rel] se il contenuto di Rn è diverso dal dato immediato; se Rn è minore del dato pone CY=1, altrimenti CY=0 | 3 | 2 |- | CJNE @Ri,#data,rel | Salta alla locazione [rel] se il contenuto della locazione puntata da Ri è diverso dal dato immediato; se il contenuto del riferimento è minore del dato pone CY=1, altrimenti CY=0 | 3 | 2 |- | DJNZ Rn,rel | Diminuisce di 1 il contenuto di Rn; se Rn non diventa 0, salta a [rel] | 2 | 2 |- | DJNZ direct,rel | Diminuisce di 1 il contenuto della locazione [direct]; se il contenuto non diventa 0, salta a [rel] | 3 | 2 |- | NOP | Nessuna operazione (ritardo di un ciclo macchina) | 1 | 1 |} '''Note''' Rn	Registri di lavoro R0-R7<br /> direct	128 locazioni di ram interna, porta di I/O, registro di controllo o stato<br /> @Ri	Locazione di RAM interna indiretta indirizzata dal registro R0 o R1<br /> #data	costante a 8 bit inclusa nell'istruzione<br /> #data16	costante a 16 bit inclusa nell'istruzione<br /> bit	128 flag software, pin di I/O, bit di controllo o stato<br /> addr16	L'indirizzo di destinazione può essere ovunque nei 64-kByte dello spazio di memoria programma<br /> addr11	L'indirizzo di destinazione sarà nella stessa pagina di memoria programma ampia 2-kByte come primo byte della corrente istruzione<br /> rel	offset a 8-bit relativo al primo byte della corrente istruzione (+127, -128)<br /> All mnemonics copyrighted (C) Intel Corporation 1979<br /> == Varianti == | |||