Montagem - Variáveis

NASM fornece vários define directivespara reservar espaço de armazenamento para variáveis. A diretiva define assembler é usada para alocação de espaço de armazenamento. Pode ser usado para reservar e também para inicializar um ou mais bytes.

Alocando espaço de armazenamento para dados inicializados

A sintaxe para declaração de alocação de armazenamento para dados inicializados é -

[variable-name]    define-directive    initial-value   [,initial-value]...

Onde, nome-da-variável é o identificador de cada espaço de armazenamento. O montador associa um valor de deslocamento para cada nome de variável definido no segmento de dados.

Existem cinco formas básicas da diretiva define -

Diretriz Objetivo Espaço de armazenamento
DB Definir Byte aloca 1 byte
DW Definir palavra aloca 2 bytes
DD Definir palavra dupla aloca 4 bytes
DQ Definir Quadword aloca 8 bytes
DT Defina dez bytes aloca 10 bytes

A seguir estão alguns exemplos de uso de diretivas de definição -

choice		DB	'y'
number		DW	12345
neg_number	DW	-12345
big_number	DQ	123456789
real_number1	DD	1.234
real_number2	DQ	123.456

Observe que -

  • Cada byte de caractere é armazenado como seu valor ASCII em hexadecimal.

  • Cada valor decimal é automaticamente convertido em seu equivalente binário de 16 bits e armazenado como um número hexadecimal.

  • O processador usa a ordenação de bytes little-endian.

  • Os números negativos são convertidos em sua representação de complemento de 2.

  • Números de ponto flutuante curtos e longos são representados usando 32 ou 64 bits, respectivamente.

O programa a seguir mostra o uso da diretiva 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 o código acima é compilado e executado, ele produz o seguinte resultado -

y

Alocando espaço de armazenamento para dados não inicializados

As diretivas de reserva são usadas para reservar espaço para dados não inicializados. As diretivas de reserva usam um único operando que especifica o número de unidades de espaço a serem reservadas. Cada diretiva define tem uma diretiva de reserva relacionada.

Existem cinco formas básicas de diretiva de reserva -

Diretriz Objetivo
RESB Reserve um Byte
RESW Reserve uma palavra
RESD Reserve uma palavra dupla
RESQ Reserve um Quadword
DESCANSAR Reserve dez bytes

Múltiplas Definições

Você pode ter várias instruções de definição de dados em um programa. Por exemplo -

choice	  DB 	'Y' 		 ;ASCII of y = 79H
number1	  DW 	12345 	 ;12345D = 3039H
number2    DD  12345679  ;123456789D = 75BCD15H

O montador aloca memória contígua para múltiplas definições de variáveis.

Múltiplas inicializações

A diretiva TIMES permite várias inicializações com o mesmo valor. Por exemplo, uma matriz chamada marcas de tamanho 9 pode ser definida e inicializada como zero usando a seguinte instrução -

marks  TIMES  9  DW  0

A diretiva TIMES é útil na definição de arrays e tabelas. O programa a seguir exibe 9 asteriscos na tela -

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 o código acima é compilado e executado, ele produz o seguinte resultado -

*********