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

    

    Gestione Strutture di Dati - STRUC, ENDS
     
bulletLa PseudoOperazione STRUC definisce una struttura di dati, in pratica una raccolta organizzata di campi racchiusa tra questa e la PseudoOperazione ENDS , con cui fa coppia; davanti ad entrambe si deve specificare il nome desiderato per la struttura.
bulletSi definisce all'inizio del programma sorgente e, nella zona dati, può essere associata ad una o più etichette, ciascuna delle quali avrà a disposizione la stessa quantità di locazioni stabilita dalla struttura stessa.
bulletCiascun campo è definito con una direttiva di tipo DB, DW, DD, DQ e DT, che ne specifica la dimensione; può avere (opzionalmente) un nome e un valore iniziale.

      

Ricorda... La coppia di direttive STRUC/ENDS non crea dati ma stabilisce un nuovo tipo di dato: i dati effettivi saranno definiti nella loro zona specifica dichiarando il loro nome seguito da quello della struttura ed eventualmente dai valori da assegnare ai vari campi, comunque separati da virgole e racchiusi tra parentesi angolari; per esempio:
       nomeVariabile 
nomeStruttura <primo,secondo,terzo>

      

bulletLa coppia di direttive STRUC/ENDS si presta bene, per esempio, per definire le schede di un archivio, caratterizzate da dati di diverso tipo (nome, cognome, età, indirizzo,.....), ma anche per altri gruppi di informazione.

      

bulletLa comodità delle strutture consiste nella possibilità di accedere ai suoi singoli campi in modo organizzato; per questo si usa un operatore molto essenziale, un semplice punto inserito tra il nome della variabile strutturata e quello del suo campo (nell'esempio proposto qui sotto: Msg_01.LungMax); l'assemblatore calcola il corretto indirizzo al campo desiderato sommando l'offset della prima (Msg_01) con LungMax) relativo all'inizio della struttura.

      

bulletUn esempio che si adatta benissimo al collaudo di questa direttiva fa riferimento ad una particolare potente funzione DOS (la Funzione 0AH dell'INT 21H, Ingresso bufferizzato) che consente l'acquisizione di una stringa di caratteri da tastiera purché venga predisposto un Buffer di memoria strutturato; supponendo di dover acquisire una serie di stringhe, per ciascuna di esse può essere definita una struttura, in accordo con le specifiche richieste per il Buffer, cioè:
bulletil primo byte del Buffer (cioè della struttura) deve contenere la lunghezza massima prevista per la stringa da acquisire (compreso il codice Ascii 0DH, corrispondente al tasto Invio, premuto dall'utente per confermare la fine della stringa digitata sulla tastiera.
bulletil secondo byte del Buffer (cioè della struttura) è riservato al DOS, che provvede a scriverci il numero di caratteri effettivamente introdotti, escluso il carattere Ascii 0DH (tasto Invio) pur presente nel Buffer).
bulletil Buffer (la struttura) deve poi disporre di tante locazioni vuote, nella quantità indicata dal primo byte.

      

bulletIl programma che segue definisce e utilizza la struttura Stringa, adatta all'acquisizione di frasi in accordo con la descrizione fornita poco fa:

      

PAGE 66,132
Tot      EQU   30
----------------------------------
Stringa  STRUC
LungMax
  DB    Tot
LungVera DB    00
Testo    DB    Tot DUP (' ')
Stringa 
ENDS
-----------------------------------
_prog    SEGMENT BYTE PUBLIC 'CODE'
        ASSUME
  CS:
alfa,DS:alfa
         ORG   0100H
INIZIO:  JMP   Main
Msg_01   Stringa <>
Msg_02   Stringa <>
Main:    LEA     DX,Msg_01       [*]
         MOV     AH,0AH          [*]
         INT     21H             [*]
         ;.......................
         MOV AL,Msg_01.LungMax   [#]
         MOV Msg_02.LungVera,AL
_prog    ENDS


14 0100      ORG 0100H

15 0100   1E Msg_01 Stringa <>
16 0101   00 
17 0102 001E
18              20 
19                    ] 
20 


21 0120   1E Msg_02 Stringa <>
22 0121   00 
23 0122 001E
24              20 
25                    ] 
26 

27 0140 EB01 INIZIO: JMP MAIN

      

La parte destra della figura mostra come l'assemblatore espanda la definizione di ciascuna scheda (nella zona dati) con tutti i bytes dichiarati dalla struttura: in entrambi i casi il primo byte è proprio 30 (il valore predefinito per Tot, 1EH in esadecimale), mentre il secondo è posto a 00H (in attesa che il DOS lo riempia); seguono 1EH bytes (cioè 30) con degli spazi (che, come è noto, hanno valore ascii 20H).
La parte sinistra della figura mostra le 3 istruzioni
[*] che, con l'aiuto della funzione 0AH del DOS, inizialiozzano le locazioni della prima scheda di formato Stringa, mentre le [#] ne manipolano le voci interne.

      

bulletDa notare la sintassi usata nell'assegnazione della struttura alle 2 schede Msg_01 e Msg_02: se le parentesi angolari, < >, non contengono nulla (come nell'esempio) i campi di ciascuna scheda sono vuoti (cioè non inizializzati).

      

bulletSenza la definizione di una struttura avremmo dovuto specificare una dopo l'altra tutte le voci per ciascuna scheda, per esempio con il codice proposto nella figura successiva: naturalmente nell'uno o nell'altro caso il codice macchina generato è sempre lo stesso: è una questione di leggibilità del sorgente, un po' come per le Macro:

      

Msg_01   LABEL  LungMax  
LungMax  DB      Tot
LungVera DB      00
Testo    DB      Tot DUP (' ')

      

La direttiva LABEL associa all'etichetta Msg_01 l'indirizzo corrente nell'area destinata alla acquisizione di stringhe da tastiera assicurata dalla Funzione 0AH dell'INT 21H; tale indirizzo coincide con quello di LungMax; ovviamente con questa tecnica siamo costretti a cambiare, per ogni definizione, tutte le etichette interne.

    

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