Sezione |
Indirizzi Base
Registri Interni
|
Schede del Tutorial |
Le PseudoOperazioni di MASM |
SCHEDA n° 02 [ 17 di 26] |
|
|
La PseudoOperazione ASSUME completa la dotazione di direttive indispensabili nel progetto dei programmi sorgente, raccolte nelle Matrici predisposte per questo fine; essa può essere inserita anche più volte nel testo, ma di solito è posta sulla linea successiva a quella occupata da SEGMENT e le sue (eventuali) opzioni di rango o di allineamento. | |
Il concetto di ASSUME è effettivamente un po' complesso; per cercare di chiarirlo scriviamo il semplice programma (parte sinistra) e ricordiamo come MASM ha codificato (parte destra) le etichette che ha trovato dentro al SEGMENT _prog: |
|
_prog
SEGMENT BYTE PUBLIC 'CODE' ASSUME CS:_prog,DS:_prog ORG 0100H INIZIO: JMP MAIN ATTRIB DB 0FH RamVideo DW 0B800h dato DD 12345678H MAIN: NOP _prog ENDS END INIZIO |
Symbols Name Type Value Attr --------------------------------- INIZIO L NEAR 0100 _PROG ATTRIB L BYTE 0103 _PROG RAMVIDEO L WORD 01CD _PROG DATO L DWORD 01FB _PROG MAIN L NEAR 0219 _PROG |
|
Per ogni simbolo MASM annota il suo tipo (indirizzo Near, o byte, o word, o altro), il rispettivo valore (in pratica l'indirizzo di offset nel segmento) e il nome (Attr) del segmento in cui le etichette sono state definite: salta subito agli occhi che tutte le etichette hanno lo stesso attributo! |
|
La presenza dell'attributo di un simbolo sottolinea il fatto che l'assemblatore non da per scontato (come noi, nei nostri esempi) che il segmento di codice sia unico, ma ammette la possibilità che ce ne siano degli altri (cosa verosimile in programmi particolarmente complessi). | |
La possibile presenza di più segmenti mette potenzialmente in imbarazzo il compilatore: per poter creare il codice macchina in grado di indirizzare ogni loro simbolo deve sapere quale registro di segmento (CS, DS, ES o SS) coinvolgere. |
|
Con i processori della serie x86 tutte le etichette relative ai DATI di un segmento sono puntate per default dal registro DS (per esempio MOV AL,[ATTRIB]), così come i riferimenti a locazioni di memoria puntate tramite registro (per esempio MOV AL,[SI]); la conseguenza logica è che il compilatore usa il registro DS per default quando codifica gli indirizzi delle etichette di dato! |
|
Dunque la direttiva ASSUME obbliga il compilatore a generare codice in grado di puntare le etichette di un determinato SEGMENT con l'aiuto di un ben preciso registro di segmento: così con la stringa ASSUME CS:_prog il compilatore dovrà usare CS nel codice macchina che descrive le istruzioni che puntano le etichette del SEGMENT _prog; da notare che le istruzioni che puntano locazioni del segmento tramite registro (come MOV AL,[SI]) continuano ad essere codificate con utilizzando comunque DS). | |
In ogni momento la direttiva ASSUME Nothing, annulla le assegnazioni date in precedenza ai 4 i registri di segmento, mentre se la parola chiave viene associata ad un singolo registro (per esempio ASSUME CS:Nothing) viene annullata solo quella relative a quel segmento. |
|
Nella pagina seguente riprenderemo questo impegnativo concetto, con l'aiuto della definizione di segment-override; conviene comunque prendere atto fin d'ora che l'azione di ASSUME si esercita solo sulle etichette di dato (variabili del segmento), cioè quei simboli definiti senza : (2 punti), per indirizzare le quali potremo di volta in volta imporre a piacere (o meglio, secondo le opportunità) i registri CS, ES o SS) (oppure DS per riportare nelle condizioni standard assunzioni modificate il precedenza). |
|
Da questo punto di vista se questa direttiva non viene esplicitamente dichiarata non viene generato alcun errore di compilazione. | |
Le etichette con i : (2 punti) invece, relative agli indirizzi correnti (near) delle istruzioni del nostro programma devono appartenere ad un segmento di codice, per cui per esse è necessario comunque scrivere la stringa ASSUME CS:_prog; senza questa direttiva la compilazione sarebbe interrotta, con segnalazione di errore grave: error A2062: Missing or unreachable CS., segmento di codice inesistente o irraggiungibile. |
|
Scheda n° 02 | Pseudo Operazioni di MASM | |||||||
Scheda n° 02 - 17 |
|
|
|
|
Home |
|
|||||||
|
Motore Ricerca |
|