Assemblea - Registri

Le operazioni del processore riguardano principalmente l'elaborazione dei dati. Questi dati possono essere archiviati in memoria e da lì accedervi. Tuttavia, la lettura e l'archiviazione dei dati nella memoria rallenta il processore, in quanto comporta complicati processi di invio della richiesta di dati attraverso il bus di controllo e nell'unità di memoria e il trasferimento dei dati attraverso lo stesso canale.

Per velocizzare le operazioni del processore, il processore include alcune posizioni di archiviazione della memoria interna, chiamate registers.

I registri memorizzano elementi di dati per l'elaborazione senza dover accedere alla memoria. Un numero limitato di registri è integrato nel chip del processore.

Registri del processore

Ci sono dieci registri del processore a 32 bit e sei a 16 bit nell'architettura IA-32. I registri sono raggruppati in tre categorie:

  • Registri generali,
  • Registri di controllo e
  • Registri di segmento.

I registri generali sono ulteriormente suddivisi nei seguenti gruppi:

  • Registri di dati,
  • Pointer registra e
  • Registri indice.

Registri dati

Quattro registri dati a 32 bit vengono utilizzati per operazioni aritmetiche, logiche e di altro tipo. Questi registri a 32 bit possono essere utilizzati in tre modi:

  • Come registri dati completi a 32 bit: EAX, EBX, ECX, EDX.

  • Le metà inferiori dei registri a 32 bit possono essere utilizzate come quattro registri di dati a 16 bit: AX, BX, CX e DX.

  • Le metà inferiore e superiore dei quattro registri a 16 bit summenzionati possono essere utilizzate come otto registri di dati a 8 bit: AH, AL, BH, BL, CH, CL, DH e DL.

Alcuni di questi registri di dati hanno un uso specifico nelle operazioni aritmetiche.

AX is the primary accumulator; viene utilizzato in input / output e nella maggior parte delle istruzioni aritmetiche. Ad esempio, nell'operazione di moltiplicazione, un operando viene memorizzato nel registro EAX o AX o AL in base alla dimensione dell'operando.

BX is known as the base register, poiché potrebbe essere utilizzato nell'indirizzamento indicizzato.

CX is known as the count register, come ECX, i registri CX memorizzano il conteggio dei loop in operazioni iterative.

DX is known as the data register. Viene anche utilizzato nelle operazioni di input / output. Viene anche utilizzato con il registro AX insieme a DX per operazioni di moltiplicazione e divisione che coinvolgono valori elevati.

Registri puntatore

I registri del puntatore sono i registri EIP, ESP ed EBP a 32 bit e le corrispondenti porzioni destre a 16 bit IP, SP e BP. Esistono tre categorie di registri puntatore:

  • Instruction Pointer (IP)- Il registro IP a 16 bit memorizza l'indirizzo di offset della successiva istruzione da eseguire. IP in associazione con il registro CS (come CS: IP) fornisce l'indirizzo completo dell'istruzione corrente nel segmento di codice.

  • Stack Pointer (SP)- Il registro SP a 16 bit fornisce il valore di offset all'interno dello stack del programma. SP in associazione con il registro SS (SS: SP) si riferisce alla posizione corrente dei dati o dell'indirizzo all'interno dello stack del programma.

  • Base Pointer (BP)- Il registro BP a 16 bit aiuta principalmente a fare riferimento alle variabili dei parametri passate a una subroutine. L'indirizzo nel registro SS viene combinato con l'offset in BP per ottenere la posizione del parametro. BP può anche essere combinato con DI e SI come registro di base per indirizzamenti speciali.

Registri indice

I registri dell'indice a 32 bit, ESI e EDI e le loro parti più a destra a 16 bit. SI e DI, vengono utilizzati per l'indirizzamento indicizzato e talvolta utilizzati in aggiunta e sottrazione. Esistono due serie di puntatori di indice:

  • Source Index (SI) - Viene utilizzato come indice di origine per le operazioni sulle stringhe.

  • Destination Index (DI) - Viene utilizzato come indice di destinazione per le operazioni sulle stringhe.

Registri di controllo

Il registro del puntatore dell'istruzione a 32 bit e il registro dei flag a 32 bit combinati sono considerati come registri di controllo.

Molte istruzioni implicano confronti e calcoli matematici e cambiano lo stato dei flag e alcune altre istruzioni condizionali testano il valore di questi flag di stato per portare il flusso di controllo in un'altra posizione.

I bit flag comuni sono:

  • Overflow Flag (OF) - Indica l'overflow di un bit di ordine elevato (bit più a sinistra) di dati dopo un'operazione aritmetica con segno.

  • Direction Flag (DF)- Determina la direzione sinistra o destra per lo spostamento o il confronto dei dati della stringa. Quando il valore DF è 0, l'operazione di stringa assume la direzione da sinistra a destra e quando il valore è impostato su 1, l'operazione di stringa assume la direzione da destra a sinistra.

  • Interrupt Flag (IF)- Determina se gli interrupt esterni come l'inserimento da tastiera, ecc. Devono essere ignorati o elaborati. Disabilita l'interrupt esterno quando il valore è 0 e abilita gli interrupt quando è impostato a 1.

  • Trap Flag (TF)- Permette di impostare il funzionamento del processore in modalità single-step. Il programma DEBUG che abbiamo usato imposta il flag trap, in modo da poter eseguire l'esecuzione un'istruzione alla volta.

  • Sign Flag (SF)- Mostra il segno del risultato di un'operazione aritmetica. Questo flag è impostato in base al segno di un elemento di dati che segue l'operazione aritmetica. Il segno è indicato dall'ordine superiore del bit più a sinistra. Un risultato positivo cancella il valore di SF a 0 e un risultato negativo lo imposta a 1.

  • Zero Flag (ZF)- Indica il risultato di un'operazione aritmetica o di confronto. Un risultato diverso da zero cancella il flag zero a 0 e un risultato zero lo imposta a 1.

  • Auxiliary Carry Flag (AF)- Contiene il riporto dal bit 3 al bit 4 a seguito di un'operazione aritmetica; usato per aritmetica specializzata. L'AF viene impostato quando un'operazione aritmetica a 1 byte provoca un trasferimento dal bit 3 al bit 4.

  • Parity Flag (PF)- Indica il numero totale di 1 bit nel risultato ottenuto da un'operazione aritmetica. Un numero pari di 1 bit cancella il flag di parità a 0 e un numero dispari di 1 bit imposta il flag di parità a 1.

  • Carry Flag (CF)- Contiene il riporto di 0 o 1 da un bit di ordine elevato (più a sinistra) dopo un'operazione aritmetica. Memorizza anche il contenuto dell'ultimo bit di un'operazione di spostamento o rotazione .

La tabella seguente indica la posizione dei bit flag nel registro Flags a 16 bit:

Bandiera: O D io T S Z UN P C
Bit no: 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

Registri di segmento

I segmenti sono aree specifiche definite in un programma per contenere dati, codice e stack. Ci sono tre segmenti principali:

  • Code Segment- Contiene tutte le istruzioni da eseguire. Un registro del segmento di codice a 16 bit o un registro CS memorizza l'indirizzo iniziale del segmento di codice.

  • Data Segment- Contiene dati, costanti e aree di lavoro. Un registro del segmento di dati a 16 bit o un registro DS memorizza l'indirizzo iniziale del segmento di dati.

  • Stack Segment- Contiene dati e indirizzi di ritorno di procedure o subroutine. È implementato come una struttura di dati "stack". Il registro Stack Segment o il registro SS memorizza l'indirizzo iniziale dello stack.

Oltre ai registri DS, CS e SS, ci sono altri registri di segmento extra - ES (segmento extra), FS e GS, che forniscono segmenti aggiuntivi per la memorizzazione dei dati.

Nella programmazione in assembly, un programma deve accedere alle posizioni di memoria. Tutte le posizioni di memoria all'interno di un segmento sono relative all'indirizzo iniziale del segmento. Un segmento inizia in un indirizzo uniformemente divisibile per 16 o esadecimale 10. Quindi, la cifra esadecimale più a destra in tutti questi indirizzi di memoria è 0, che generalmente non è memorizzata nei registri del segmento.

I registri del segmento memorizzano gli indirizzi iniziali di un segmento. Per ottenere la posizione esatta dei dati o dell'istruzione all'interno di un segmento, è necessario un valore di offset (o spostamento). Per fare riferimento a qualsiasi posizione di memoria in un segmento, il processore combina l'indirizzo del segmento nel registro del segmento con il valore di offset della posizione.

Esempio

Guarda il seguente semplice programma per comprendere l'uso dei registri nella programmazione in assembly. Questo programma mostra 9 stelle sullo schermo insieme a un semplice messaggio:

section	.text
   global _start	 ;must be declared for linker (gcc)
	
_start:	         ;tell linker entry point
   mov	edx,len  ;message length
   mov	ecx,msg  ;message to write
   mov	ebx,1    ;file descriptor (stdout)
   mov	eax,4    ;system call number (sys_write)
   int	0x80     ;call kernel
	
   mov	edx,9    ;message length
   mov	ecx,s2   ;message to write
   mov	ebx,1    ;file descriptor (stdout)
   mov	eax,4    ;system call number (sys_write)
   int	0x80     ;call kernel
	
   mov	eax,1    ;system call number (sys_exit)
   int	0x80     ;call kernel
	
section	.data
msg db 'Displaying 9 stars',0xa ;a message
len equ $ - msg  ;length of message
s2 times 9 db '*'

Quando il codice precedente viene compilato ed eseguito, produce il seguente risultato:

Displaying 9 stars
*********