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 [ 21  di 26] 

    

    Opzioni di Rango dei Segmenti - PUBLIC, STACK, COMMON, MEMORY, AT
     
bulletDi solito la direttiva SEGMENT viene seguita da una serie di opzioni di 3 tipi diversi: l'allineamento (aling), il rango (combine) e la classe ('class'). Nell'esempio viene presentata la direttiva SEGMENT con le scelte usate in questo tutorial:

      

_prog SEGMENT BYTE PUBLIC 'CODE'
      ; qui vanno inserite le istruzioni
_prog ENDS

      

bulletL'opzione di classe va sempre indicata tra apici e può servire per differenziare con nomi diversi i bytes appartenenti a segmenti dello stesso rango.
bulletLe opzioni di rango indicano all'assemblatore il modo di manipolare (combinare, (combine)) i segmenti della stessa classe (cioè con lo stesso nome); se non viene specificato alcun rango (opzione di default) ciascun segmento sarà separato agli altri e verrà allocato in memoria nella posizione indicata dal proprio indirizzo fisico, anche in posizioni non adiacenti. Il rango può essere  PUBLIC, STACK, COMMON, MEMORY e AT. Vediamoli in dettaglio:
bulletPUBLIC: se i segmenti della stessa classe (per esempio tutti quelli di nome 'Code') hanno questo rango l'assemblatore provvede a lasciare indicazioni affinché il linker possa riunirli in un unico blocco contiguo, ponendoli uno dopo l'altro a partire dalla locazione iniziale suggerita dall'opzione di allineamento. Questo comporta la rilocazione degli indirizzi di alcuni blocchi concorrenti, in modo da essere comunque relativi all'inizio del nuovo segmento.
bulletSTACK: come per il rango PUBLIC l'assemblatore provvede a lasciare indicazioni affinché il linker possa riunire in un unico blocco contiguo tutti i segmenti della stessa classe (per esempio tutti quelli di nome 'Stack') con questo rango; questa volta però il nuovo segmento, frutto del concatenamento di tutti gli altri, sarà automaticamente assegnato al registro di segmento SS, mentre il registro SP sarà fatto puntare alla sua fine. Se non specifichiamo il rango STACK per il nostro segmento di stack (ammesso che vogliamo definirlo) dovremo provvedere noi (con istruzioni esplicite nel programma sorgente) ad assegnarlo al registro SS.

      

Suggerimento In alternativa, la direttiva .STACK può servire per obbligare l'assemblatore a generare uno stack di 1024 bytes; specificando un numero dopo di essa è anche possibile modificare la dimensione di default (es: .STACK 64 crea uno stack di 64 bytes).

      

bulletCOMMON: l'assemblatore lascia indicazioni affinché il linker sovrapponga i segmenti della stessa classe con questo rango; questo comporta il fatto che i riferimenti a etichette presenti in più segmenti vengano in effetti fatti a quella caricata per ultima.
bulletMEMORY: il linker della Microsoft non supporta questo rango, per cui i segmenti di questo tipo saranno trattati come fossero PUBLIC; in realtà dovrebbero invece essere allocati nell'ultimo segmento disponibile in memoria, cioè quello associato agli indirizzi più alti, comunque dopo tutti gli altri segmenti allocati.
bulletAT: questo rango consente di localizzare un'area di memoria a partire da un ben preciso indirizzo fisico di segmento specificato subito dopo AT.

      

Suggerimento Questa direttiva è decisamente interessante e può tornar utile in casi particolari; con essa è possibile coprire e gestire facilmente tutti i dati contenuti in una particolare area di sistema, di solito di dimensione inferiore al segmento (64k), come la Tabella dei Vettori (a partire da 0000:0000) o l'Area di Comunicazione Bios (0000:0400H), o la Ram Video nei modi testo (B800:0000) e così via...

      

bullet La sintassi è leggermente diversa da quella degli altri ranghi, non essendo necessario definire ne allineamento ne classe: tutte le etichette specificate dentro questo particolare segmento saranno relative all'indirizzo di segmento assoluto specificato, a partire dall'indirizzo di offset 0000 (se non diversamente specificato dalla eventuale direttiva ORG). Data la sua particolarità forniamo 2 esempi di applicazione, da inserire a piacere nel nostro codice sorgente:

      

TABint SEGMENT AT 0000H  
       ORG 0009H*4     ; Localizza  l'indirizzo  del   puntatore
INT_09 LABEL DWORD     ; alla locazione di servizio dell'INT 09H
TABint ENDS  
       ASSUME ES:TABint

      

areaBIO    SEGMENT AT 0040H
           ORG 0001AH  ; Localizza l'indirizzo  dell'area di co-
                       ; municazione BIOS dedicata alla tastiera
inizioBuff DW ?        ; inizioBuff  = inizio BUFFER
fineBuff   DW ?        ; fineBuff    = fine del BUFFER
Buffer     DW 16 DUP(?); Buffer   = vera area per i codici tasti
postBuff   LABEL word  ; postBuff = locazione successiva all'ul-
areaBIO    ENDS        ;            tima del BUFFER
           ASSUME ES:areaBIO

      

bullet Si osservi come, in entrambi gli esempi si sia deciso di puntare i 2 segmenti con il registro ES poiché esso è il puntatore alla zona ExtraDati è sempre una buona scelta. In questo modo l'assemblatore compilerà il codice che punta ciascuna delle etichette interne con override ES: (MOV AL,ES:[INT_09]) mentre è necessario evitare di scrivere senza override le istruzioni di puntamento tramite registro (come MOV AL,[SI]) per evitare la compilazione di default con riferimento a DS (cioè bisogna scrivere MOV AL,ES:[SI]).

    

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 -  21
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