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 -
*********