| Se le
variabili sono definite con l'uso di
DUP può tornare comodo imparare ad usare anche alcuni
altri operatori in grado di fornire informazioni sulla variabile
intesa in senso globale; per fissare le idee prendiamo ad esempio le 3
definizioni seguenti:
Dati01 DW 10 DUP (12ABH)
;10 words (tutte contenenti il valore 12ABH)
Buffer DB 10 DUP (2AH)
;10 bytes (tutti contenenti '*')
Stack_ DB 30 DUP ('GIO_2001') ;30*8 bytes (contenenti 30
stringhe da 8 caratteri) |
Con l'aiuto di alcuni operatori specifici
possiamo assumere informazioni sulle 3 variabili:
| l'operatore TYPE
restituisce il numero di bytes corrispondenti al tipo di variabile
coinvolta (cioè 1 per DB, 2 per
DW, 4 per DD, 8
per DQ e 10 per
DT); può essere utilizzato anche con le etichette che
rappresentano
indirizzi di procedura, ma
nel nostro caso abbiamo:
MOV AX,TYPE
Dati01 ;lascia 2 in AX (contiene Words -->
DW)
MOV BX,TYPE
Buffer ;lascia 1 in BX (contiene Bytes -->
DB)
MOV CX,TYPE
Stack_ ;lascia 1 in CX (contiene Bytes -->
DB) |
|
| l'operatore LENGTH
restituisce il numero di elementi dello stesso tipo (TYPE)
definiti per la variabile che coinvolge l'operatore
DUP; per certi versi è dedicata a questa modalità di
assegnazione. Se si utilizza questo operatore in assegnazioni nelle quali
non c'è DUP viene restituito il
valore 1; nei nostri esempi, invece:
MOV AX,LENGTH
Dati01 ;lascia 10 in AX (contiene 10 Words)
MOV BX,LENGTH
Buffer ;lascia 10 in BX (contiene 10 Bytes)
MOV CX,LENGTH
Stack_ ;lascia 30 in CX (contiene 30 Stringhe) |
|
| l'operatore SIZE
è forse il più utile: restituisce il numero di locazioni riservate
dall'assemblatore per una determinata variabile; è dunque l'ideale per
conoscere il numero di bytes di variabili definite
con l'operatore
DUP. In alternativa, per sapere questo numero è necessario
moltiplicare il tipo (TYPE) di
variabile coinvolta per il numero di elementi (LENGTH)
di quel tipo; nei nostri esempi:
MOV AX,SIZE
Dati01 ;lascia 20 in AX (10 elementi
di tipo 2, Words)
MOV BX,SIZE
Buffer ;lascia 10 in BX (10 elementi
di tipo 1, Bytes)
MOV CX,SIZE
Stack_ ;lascia 30 in CX (30 elementi
di tipo 1, Bytes) |
Possiamo notare che in realtà
SIZE=TYPE*LENGTH,
per cui nel caso di
DB espressi sotto forma di
stringa (come Stack_) la formula
non vale (bisogna moltiplicare
ulteriormente SIZE per il numero
di caratteri della stringa). |
|