Assembly - Variabili
NASM fornisce vari define directivesper riservare lo spazio di archiviazione per le variabili. La direttiva define assembler viene utilizzata per l'allocazione dello spazio di archiviazione. Può essere utilizzato per riservare e inizializzare uno o più byte.
Allocazione dello spazio di archiviazione per i dati inizializzati
La sintassi per l'istruzione di allocazione della memoria per i dati inizializzati è:
[variable-name] define-directive initial-value [,initial-value]...
Dove, nome-variabile è l'identificativo per ogni spazio di archiviazione. L'assembler associa un valore di offset per ogni nome di variabile definito nel segmento di dati.
Esistono cinque forme di base della direttiva define:
Direttiva | Scopo | Spazio di archiviazione |
---|---|---|
DB | Definisci byte | alloca 1 byte |
DW | Definisci la parola | alloca 2 byte |
DD | Definisci Doubleword | alloca 4 byte |
DQ | Definisci Quadword | alloca 8 byte |
DT | Definisci dieci byte | alloca 10 byte |
Di seguito sono riportati alcuni esempi di utilizzo delle direttive di definizione:
choice DB 'y'
number DW 12345
neg_number DW -12345
big_number DQ 123456789
real_number1 DD 1.234
real_number2 DQ 123.456
Si prega di notare che -
Ogni byte di carattere viene memorizzato come valore ASCII in esadecimale.
Ogni valore decimale viene convertito automaticamente nel suo equivalente binario a 16 bit e memorizzato come numero esadecimale.
Il processore utilizza l'ordinamento dei byte little-endian.
I numeri negativi vengono convertiti nella sua rappresentazione in complemento a 2.
I numeri in virgola mobile brevi e lunghi vengono rappresentati utilizzando rispettivamente 32 o 64 bit.
Il seguente programma mostra l'uso della direttiva define -
section .text
global _start ;must be declared for linker (gcc)
_start: ;tell linker entry point
mov edx,1 ;message length
mov ecx,choice ;message to write
mov ebx,1 ;file descriptor (stdout)
mov eax,4 ;system call number (sys_write)
int 0x80 ;call kernel
mov eax,1 ;system call number (sys_exit)
int 0x80 ;call kernel
section .data
choice DB 'y'
Quando il codice precedente viene compilato ed eseguito, produce il seguente risultato:
y
Allocazione dello spazio di archiviazione per i dati non inizializzati
Le direttive sulla riserva vengono utilizzate per riservare spazio ai dati non inizializzati. Le direttive di riserva accettano un singolo operando che specifica il numero di unità di spazio da riservare. Ogni direttiva di definizione ha una direttiva di riserva correlata.
Esistono cinque forme di base della direttiva sulla riserva:
Direttiva | Scopo |
---|---|
RESB | Prenota un byte |
RESW | Prenota una parola |
RESD | Prenota una Doubleword |
RESQ | Prenota un Quadword |
RIPOSO | Riserva dieci byte |
Definizioni multiple
È possibile avere più istruzioni di definizione dei dati in un programma. Ad esempio:
choice DB 'Y' ;ASCII of y = 79H
number1 DW 12345 ;12345D = 3039H
number2 DD 12345679 ;123456789D = 75BCD15H
L'assembler alloca memoria contigua per più definizioni di variabili.
Inizializzazioni multiple
La direttiva TIMES consente più inizializzazioni con lo stesso valore. Ad esempio, una matrice denominata segni di dimensione 9 può essere definita e inizializzata a zero utilizzando la seguente istruzione:
marks TIMES 9 DW 0
La direttiva TIMES è utile per definire array e tabelle. Il seguente programma visualizza 9 asterischi sullo schermo:
section .text
global _start ;must be declared for linker (ld)
_start: ;tell linker entry point
mov edx,9 ;message length
mov ecx, stars ;message to write
mov ebx,1 ;file descriptor (stdout)
mov eax,4 ;system call number (sys_write)
int 0x80 ;call kernel
mov eax,1 ;system call number (sys_exit)
int 0x80 ;call kernel
section .data
stars times 9 db '*'
Quando il codice precedente viene compilato ed eseguito, produce il seguente risultato:
*********