Sezione

Indirizzi Base Registri Interni
Area Comunicazione BIOS Funzioni BIOS Funzioni DOS
Prefazione Capitolo 1 Capitolo 2 Schede
Libreria ASM Libreria MAC Palestra Progetti ASM
Info Download INDICE

Capitolo 1

Home » Programma il Computer » Tutorial Assembly

Capitolo 1 - Il processore - Il Debugger

  Il Processore e il Debugger

ISTRUZIONI 80x86 3/3 [28 di 60] 

    

    Modi di indirizzamento
     
bulletQuando si scrive un'istruzione di solito gli operandi vengono coinvolti con un meccanismo mentale automatico, senza pensarci più di tanto; i formalisti più attenti amano però associare ogni nostra scelta d'istinto a definizioni spesso poco memorabili, solo per il gusto di inquadrare tutto in rigidi schemi.
bulletLa premessa probabilmente sorprenderà i luminari ed è per questo che ho deciso, comunque, di cercare un certo formalismo per esprimere questi concetti.
bulletIn altre parole il problema non consiste nello stabilire dove trovare il dato da coinvolgere nelle operazioni del processore (cosa sacrosanta e del tutto necessaria), ma come chiamare questa tecnica di ricerca, cioè stabilire qual è il Modo di Indirizzamento.

      

bulletSebbene i processori moderni siano in grado di gestire in modo diretto grandi quantità di memoria (quelli a 32 bit possono utilizzare puntatori in grado di indirizzare 232=4294967296 locazioni, cioè 4 Gbytes) in quasi tutte le pagine di questo tutorial si darà ospitalità ai programmi che lavorano con i registri a 16 bit, per altro naturalmente validi per tutta la famiglia 80x86; per questo i puntatori di memoria saranno in grado di servire aree di 216=65536 locazioni (64 Kbytes), a noi ben note come Segmenti.

      

bulletDunque in funzione della tecnica d'accesso ad un determinato dato; vediamo i possibili di modi di indirizzamento:

      

bullettra registri: il dato è contenuto in un registro e viene semplicemente travasato in un altro registro (es: MOV AX,BX); si tratta del metodo più veloce possibile dato che il processore trova già dentro se stesso le informazioni necessarie per eseguire l'istruzione; naturalmente non è possibile coinvolgere registri di dimensione diversa.

      

bulletimmediato: il dato è indicato direttamente dall'istruzione e viene inserito nel registro specificato (es: MOV AX,1234H); sebbene la presenza del numero nella sintassi dell'istruzione possa indurre un pensiero di immediatezza anche nell'esecuzione, dobbiamo pensare che il dato costante è, in realtà, scritto nella memoria di programma (cioè quella puntata da CS:IP) dopo il codice operativo: per questo il processore è costretto ad eseguire uno o più accessi in memoria (a seconda della dimensione del dato) per prelevarlo e porlo nella coda d'istruzione, prima di sistemarlo:
bulletdentro se stesso, in un registro MOV AX,1234H).
bulletin memoria MOV [Depo02],1234H); in questo caso la costante assunta dalla memoria di programma dovrà essere spostata nella memoria dati (cioè puntata per default da DS:Offset, ma anche in altro segmento, se si impone esplicitamente un override, MOV CS:[Depo02],1234H).

      

bulletdiretto: il dato è localizzato dall'etichetta specificata direttamente dall'istruzione, ed è coinvolto (in lettura o in scrittura) con un registro di dimensione uguale a quella dell'operando diretto stesso (es: MOV AX,Depo02); bisogna sottolineare che:
bulletl'etichetta non rappresenta l'indirizzo del dato ma il dato stesso!, cioè il dato contenuto nella locazione puntata da quell'indirizzo; per questo, sebbene la sintassi proposta come esempio sia perfettamente legale, personalmente preferisco educarmi a scriverla così MOV AX,[Depo02]: poiché il  compilatore la riconosce allo stesso modo mi sembra una scelta più vicina alla realtà.
bulletl'altro operando deve avere la stessa dimensione del dato associato all'etichetta (con DB o DW o DD, nella riga di programma che definisce la variabile); in caso contrario è necessario utilizzare l'operatore Byte o Word o Dword (per esempio per trasferire in AL solo la parte bassa della word memorizzata inDepo02 bisogna scrivere MOV AL,Byte Ptr [Depo02]

      

bulletindiretto tramite registro: il dato è localizzato con l'aiuto di un registro di Offset, di solito SI o DI ma anche altri registri a 16 bit:
bulletla sintassi di queste istruzioni (es: MOV AX,[SI]) è, in questo caso, meno ambigua, dando con le parentesi quadre, il senso di contenuto della locazione puntata da SI (o qualunque altro registro).
bulletper altro, se l'operando sorgente è una costante, è assolutamente necessario specificare anche la dimensione del dato, con l'operatore Byte o Word o Dword Ptr, per evitare segnalazioni d'errore da parte dell'assemblatore,  per esempio: MOV Byte Ptr [Si],100)

      

bulletindiretto tramite registro e spiazzamento: il dato è localizzato sommando il contenuto di un registro indice, SI o DI, o base, BX o BP, con il numero esadecimale con segno a 8 o a 16 bit, specificato nell'istruzione, detto displacement (spiazzamento) (es: MOV AX,[SI+10]):
bulletla somma del contenuto dei registri con il numero fornito punta una locazione nel segmento DS se i registri coinvolti sono SI, DI o BX, e nel segmento SS se il registro è BP.
bulletl'utilità di questo metodo è evidente quando è necessario scorrere una tabella in modo dinamico, a partire da un certo punto; per esempio con la MOV AX,[Depo02+SI] basta cambiare il valore corrente di SI per assumere, una dopo l'altra, le word contenute nella tabella Depo02

      

bulletindiretto tramite registro indice e base e spiazzamento: il dato è localizzato sommando il contenuto di un registro indice, SI o DI, con uno base, BX o BP, e con il numero esadecimale con segno a 8 o a 16 bit, specificato nell'istruzione, detto displacement (spiazzamento) (es: MOV AX,[SI+BX+10]):
bulletla somma del contenuto dei registri con il numero fornito punta una locazione nel segmento DS se il registro base coinvolto è BX, e nel segmento SS se invece è BP.
bulletquesta ulteriore opzione rende ancora più versatile la gestione dinamica delle tabelle.

    

Pagina Precedente Capitolo 1 Pagina Successiva ISTRUZIONI 80x86 3/3   Torna alla Home  del Capitolo1 del "Tutorial" Lezioni - Vai al DownLoad dei files DOC Torna al Menu del "Tutorial"
28 di 60
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60

    

CAP. 1 » 1. Processore 80x86 2. Istruzioni 80x86  3. Debug  4. La Grande Libreria
TUTORIAL » Indirizzi Base | Registri Interni | Area Comunicaz. BIOS | Funzioni BIOS | Funzioni DOS
Prefazione | CAP 1 | CAP 2 | Schede | Palestra
Libreria ASM | Libreria MAC | Progetti ASM | Download | Info | Indice
Home 
Pascal|Manuali|Tabelle|Schede
Tutorial Assembly|Palestra Assembler
Aggiungi Giobe®2000 ai preferiti  
Motore
Ricerca
  Rendi Giobe®2000 pagina di Default
© 2001-2010  -  Studio Tecnico ing. Giorgio OBER
Tutti i diritti sono riservati