|
 |
Le
PseudoOperazioni di MASM |
SCHEDA n° 02 [
13
di 26] |
 |
|
Gestione Strutture di Dati - STRUC,
ENDS |
|
 | La 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.
|
 | Si 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. |
 | Ciascun 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. |
 |
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> |
 | La 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. |
 | La 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. |
 | Un 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è:
 | il 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. |
 | il 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). |
 | il Buffer (la struttura) deve poi disporre di tante
locazioni vuote, nella quantità indicata dal primo byte. |
|
 | Il 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.
|
 | Da 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). |
 | Senza 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. |
©
2001-2010 - Studio Tecnico
ing. Giorgio OBER
Tutti i diritti sono riservati
|