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:

*********