Assembly Programming Tutorial #2: Indirizzamento

206 Views 0 Comment

MODALITA’ DI INDIRIZZAMENTO

Esistono diverse modalità di indirizzamento per far riferimento ai dati:

  • Indirizzamento a dati immediati;
  • Indirizzamento implicito;
  • Indirizzamento a registro;
  • Indirizzamento del segmento dati;
  • Indirizzamento del segmento di stack.

INDIRIZZAMENTO A DATI IMMEDIATI

L’operando di un’istruzione può essere una costante (un byte o una parola)
MOV DX, 4  ;copia in DX il valore costante 4

INDIRIZZAMENTO IMPLICITO

Nell’ indirizzamento implicito l’operando (o gli operandi) dell’istruzione sono specificati implicitamente dall’ istruzione stessa:

PUSH AX  ;replica il contenuto di AX in cima allo stack mediante il decremento di SP e la copia nella                        nuova locazione puntata da SP

MUL 5       ;AX = AX × 5

Nelle istruzioni sopra riportate si fa riferimento a registri non specificati, ad esempio l’istruzione PUSH implica l’uso del registro SP, mentre l’ uso dell’istruzione MUL implica l’uso del registro AX

INDIRIZZAMENTO A REGISTRO

La maggior parte delle istruzioni possono operare sui registri d’uso generale. I registri a 16 e a 8 bit possono essere operandi sorgente o destinazione, l’unica cosa da tenere in considerazione è il fatto che gli operandi debbano avere la stessa dimensione.
Esempi:
MOV BX, AX  ;copia in BX il valore di AX
MOV AH, CL  ;copia in AH il valore di CL
MOV SI, AX    ;copia in SI il valore di AX
MOV AX, BL   ERRATO!

Anche i registri di segmento possono essere usati come uno degli operandi:
MOV AX, CS  ;copia in AX il valore di CS
MOV DS, AX  ;copia in DS il valore di AX

INDIRIZZAMENTO DEL SEGMENTO DATI

L’indirizzamento può essere rivolto a dati presenti in memoria, l’ accesso in memoria è più lento rispetto a quello ai registri.
Le modalità di indirizzamento del segmento di dati si possono riassumere in 5 classi:

  • indirizzamento diretto
  • indirizzamento a registro indiretto
  • indirizzamento a registro con spiazzamento
  • indirizzamento a registro con indice
  • indirizzamento a registro con indice e spiazzamento

INDIRIZZAMENTO DIRETTO

È la modalità più semplice di indirizzamento al segmento dei dati e l’istruzione contiene l’indirizzo dei dati nell’operando stesso.
MOV DL, [8012h]  ;copia in DL il byte all’offset 8012h
L’indirizzamento diretto fornisce di default l’offset del segmento dei dati (DS).
Si possono specificare altri segmenti a cui far riferimento, come ad esempio:
MOV AX, ES:[6098h]  ;copia in AX la parola all’offset 6098h dell’extra segment (ES)
L’indirizzamento diretto è adatto per l’accesso alle variabili
MOV BL, NOME_VARIABILE   ;copia in BL il contenuto della variabile.

INDIRIZZAMENTO A REGISTRO INDIRETTO

È possibile accedere alla memoria indirettamente ovvero attraverso un registro, i registri ammessi per l’indirizzamento indiretto sono BX, SI, DI 
MOV AL, [BX]    ;copia in AL il byte all’offset presente nel registro BX
L’indirizzamento a registro indiretto fornisce di default l’offset del segmento dei dati (DS), ma è possibile specificare altri segmenti a cui far riferimento:
MOV BX, ES:[DI]  ;copia in BX la parola all’offset dell’extra segment (ES) trovato nel registro DI

INDIRIZZAMENTO A REGISTRO CON SPIAZZAMENTO

È possibile aggiungere uno spiazzamento (valore costante) da sommare all’offset presente nel registro:
MOV AX, 3000h             ;copia in AX il valore 3000h
MOV CL, [BX+20]           ;copia in CL il byte alla locazione DS:1020h
È possibile specificare altri segmenti a cui far riferimento
MOV BX, 1000h              ;copia in BX il valore 1000h
MOV BL, ES:[BX+20h]    ;copia in BL il byte alla locazione ES:1020h

INDIRIZZAMENTO A REGISTRO CON INDICE

È possibile formare l’offset sommando il registro di base (BX) con uno dei registri indice (SI o DI)
MOV AL, [BX+SI]          ;copia in AL il byte alla locazione DS:(BX+SI)
MOV BL,[BX+DI]           ;copia in BL il byte alla locazione DS:(BX+DI)
È possibile specificare altri segmenti a cui far riferimento
MOV DL, ES:[BX+SI]     ;copia in DL il byte alla locazione ES:(BX+SI)

INDIRIZZAMENTO A REGISTRO CON INDICE E SPIAZZAMENTO

È possibile combinare l’indirizzamento a registro con spiazzamento e l’indirizzamento a registro con indice, così facendo, si forma l’ offset sommando il registro di base (BX) con uno dei registri indice (SI o DI) e con uno spiazzamento (valore costante)
MOV AL, [BX+SI+5]         ;copia in AL il byte alla locazione DS:(BX+SI+5)
MOV DL, [BX+DI+5]         ;copia in AL il byte alla locazione DS:(BX+DI+5)
È possibile specificare altri segmenti a cui far riferimento
MOV AL, ES:[BX+SI+5]    ;copia in AL il byte alla locazione ES: (BX+SI+5)

INDIRIZZAMENTO DEL SEGMENTO DI STACK

Le modalità di indirizzamento del segmento di stack si possono riassumere in 4 classi:

  • Indirizzamento indiretto a puntatore base
  • Indirizzamento a puntatore base con spiazzamento
  • Indirizzamento a puntatore base con indice
  • Indirizzamento a puntatore base con indice e spiazzamento

Tutte le modalità di indirizzamento indiretto del segmento dati si possono usare per il segmento di stack, basta usare come puntatore base il registro BP al posto del registro BX!

 

Nel prossimo articolo impareremo a Muovere i primi passi in Assembly, se invece ti sei perso l’articolo introduttivo, fai click QUI.

Stai cercando altre guide? Allora dai uno sguardo alla nostra raccolta dedicata alla Programmazione Assembly.

Alla prossima!


Continua a seguirci su:

Facebook Instagram Telegram Rss
0 Comments

Leave a Comment