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

Schede del Tutorial

Home » Programma il Computer » Tutorial Assembly

Le Schede del Tutorial

  Le PseudoOperazioni di MASM

SCHEDA n° 02 [ 19  di 26] 

    

  Aggiornato 02 gennaio 2004 e 11 aprile 2006
    Gestione dei Segmenti - ASSUME e Segment-override
     
bulletCon il concetto di segment-override andiamo a rivisitare le nozioni relative all'influenza di ASSUME sul codice creato per l'indirizzamento delle variabili.
bulletPer evitare malintesi ricordo che la posizione logica delle locazioni di memoria destinate alle variabili dipende dal tipo di eseguibile realizzato:
bulletse di tipo EXE (plurisegmentale) alle variabili, di norma, è destinata un'intera area di memoria da 64k (segmento) puntata per default dal registro DS
bulletse di tipo COM (intasegmentale) le variabili sono inserite inevitabilmente nell'unico segmento disponibile in questo caso, chiamato a servire sia il codice, sia i dati, sia lo stack (definito con l'etichetta _prog, nei miei sorgenti); le variabili sono ancora puntate per default dal registro DS ma poichè il segmento è unico, tutti i registri di segmento puntano ad esso (CS=DS=ES=SS), per cui potrebbero essere localizzate anche con CS...

      

Ricorda... In condizioni di default (cioè senza alcuna particolare aggiunta al sorgente) il compilatore usa il registro DS per codificare gli indirizzi delle etichette di dato; le istruzioni MOV AL,[SI] e MOV AL,DS:[SI] sono dunque logicamente identiche, nel senso che il codice macchina generato sarà il medesimo (8A04) rendendo pleonastica la presenza dell'override DS:

      

bulletVediamo ora in che misura influisce la (eventuale) presenza della direttiva ASSUME e della tecnica di segment-override; analizziamo i vari casi con l'aiuto di Debug:
bulletNessuna direttiva ASSUME: il riferimento esplicito al simbolo (=etichetta) ,[#], è codificato come se avesse override DS: a conferma del fatto che, per default, le variabili sono codificate come se fossero nel segmento dati (indirizzato per default da DS); la forzatura esplicita con l'override CS:,[*], obbligherà il processore a puntare il dato con il nuovo registro di segmento, con il costo di un byte macchina in più (2EH):

      

MAIN:   MOV   AL,[ATTRIB]    [#]
        MOV   AL,DS:[ATTRIB] 
        MOV   AL,CS:[ATTRIB] [*]
A00301   MOV   AL,[0103]
A00301   MOV   AL,[0103]
2EA00301 MOV   AL,CS:[0103]

      

bulletDichiarazione di ASSUME CS:_prog: in realtà, per evitare la segnalazione d'errore, non possiamo fare a meno di dichiarare almeno questa assegnazione; la sua presenza obbligherà l'assemblatore a codificare ogni riferimento al simbolo senza override,[#], come se avesse override CS:. Sebbene ci costi un byte macchina in più (2EH) la cosa è desiderabile e da' sicurezza perchè garantisce che il processore troverà il nostro dato in ogni situazione; possiamo sottolineare inoltre che la scrittura esplicita dell'override CS:non costa nulla di più, per cui conviene abituarci a scrivere l'istruzione in questo modo, [*]. In questo caso la dichiarazione esplicita dell'override DS: ([@]) ci permette di risparmiare un byte macchina, ma può rendere precario il rilevamento del dato (vedi nota dedicata): 

      

MAIN:   MOV   AL,[ATTRIB]    [#]
        MOV   AL,DS:[ATTRIB] [@]
        MOV   AL,CS:[ATTRIB] [*]
2EA00301 MOV   AL,CS:[0103]
A00301   MOV   AL,[0103]
2EA00301 MOV   AL,CS:[0103]

      

bulletDichiarazione di ASSUME CS:_prog, DS:_prog: questa scelta è solo in apparenza contraddittoria; entrambi i registri di segmento CS e DS sono chiamati, in sequenza, a diventare riferimento per le etichette del segmento _prog, quindi quello che prevale sembra essere DS (così come sembra inutile, dunque, dichiarare prima CS). In realtà con questa sequenza di dichiarazioni CS si occuperà delle etichette con i 2 punti, associate agli entry-point (indirizzi near) presenti nelle istruzioni del programma, mentre DS , definito per ultimo, sarà usato per codificare gli indirizzamenti alle variabili di _prog.
Come nel caso di default, il riferimento al simbolo senza override,
[#], è codificato come se avesse override DS:, [@]; in questo caso per garantire al processore di trovare il nostro dato in ogni situazione diventa fortemente consigliato riferirsi alle variabili con dichiarazione esplicita dell'override CS:,[*], anche se, come è noto, ci costa ogni volta un byte macchina in più (2EH):

      

MAIN:   MOV   AL,[ATTRIB]    [#]
        MOV   AL,DS:[ATTRIB] [@]
        MOV   AL,CS:[ATTRIB] [*]
A00301   MOV   AL,[0103]
A00301   MOV   AL,[0103]
2EA00301 MOV   AL,CS:[0103]

      

bulletCome con CS:, in ogni caso, con o senza direttive ASSUME, la forzatura esplicita con override diversi da DS: obbligherà il compilatore a generare un codice macchina con un byte in più (36Hper SS:e 26H per ES:):

      

        MOV   AL,SS:[ATTRIB] 
        MOV   AL,ES:[ATTRIB] 
36A00301 MOV   AL,SS:[0103]
26A00301 MOV   AL,ES:[0103]

      

bulletIn ogni caso, inoltre, il riferimento a locazioni del segmento tramite registro senza override è comunque codificato come se avesse override DS:,[@]; anche in questo caso diventa fortemente consigliato riferirsi alle variabili con dichiarazione esplicita dell'override CS:,[*]:

      

       MOV   AL,[SI]
       MOV   AL,DS:[SI]     [@]
       MOV   AL,CS:[SI]     [*]
       MOV   AL,ES:[SI]
       MOV   AL,SS:[SI]
8A04   MOV   AL,[SI]
8A04   MOV   AL,[SI]
2E8A04 MOV AL,CS:[SI]
268A04 MOV AL,ES:[SI]
368A04 MOV AL,SS:[SI]

      

Ricorda... Tutte le istruzioni di tipo MOV AL,[ATTRIB] o MOV AL,[SI]sono codificare con il registro di segmento specificato dall'ultima direttiva ASSUME associata al segmento che le contiene.

      

bulletNei miei programmi (compresi quelli offerti in ogni parte di questo Sito) ho utilizzato sempre l'override CS: nella lettura e scrittura di ogni locazione definita nell'unico segmento disponibile; abbiamo imparato che la cosa non è ovvia come sembra, sebbene sia nella gran parte dei casi non strettamente necessaria... (vedi nota dedicata).

    

Pagina Precedente Scheda n° 02 Pagina Successiva Pseudo Operazioni di MASM Torna al Menu delle Schede del "Tutorial" Lezioni - Vai al DownLoad dei files DOC Torna al Menu del "Tutorial"
Scheda n° 02 -  19
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

    

SCHEDE » 1.Header EXE 2.PseudoOp MASM 3.Differenza tra Macro e Procedure
4.
Tabella Vettori 5.PSP 6.Stack 7.Istruzioni 80x86
8.La misura dell'Informazione 9.Numeri e Logica Binaria
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