Montagem - Matrizes
Já discutimos que as diretivas de definição de dados para o montador são usadas para alocar armazenamento para variáveis. A variável também pode ser inicializada com algum valor específico. O valor inicializado pode ser especificado na forma hexadecimal, decimal ou binária.
Por exemplo, podemos definir uma variável de palavra 'meses' de uma das seguintes maneiras -
MONTHS DW 12
MONTHS DW 0CH
MONTHS DW 0110B
As diretivas de definição de dados também podem ser usadas para definir uma matriz unidimensional. Vamos definir uma matriz unidimensional de números.
NUMBERS DW 34, 45, 56, 67, 75, 89
A definição acima declara uma matriz de seis palavras, cada uma inicializada com os números 34, 45, 56, 67, 75, 89. Isso aloca 2x6 = 12 bytes de espaço de memória consecutivo. O endereço simbólico do primeiro número será NÚMEROS e o do segundo número será NÚMEROS + 2 e assim por diante.
Tomemos outro exemplo. Você pode definir um array denominado inventário de tamanho 8 e inicializar todos os valores com zero, como -
INVENTORY DW 0
DW 0
DW 0
DW 0
DW 0
DW 0
DW 0
DW 0
Que pode ser abreviado como -
INVENTORY DW 0, 0 , 0 , 0 , 0 , 0 , 0 , 0
A diretiva TIMES também pode ser usada para várias inicializações com o mesmo valor. Usando TIMES, a matriz INVENTORY pode ser definida como:
INVENTORY TIMES 8 DW 0
Exemplo
O exemplo a seguir demonstra os conceitos acima definindo uma matriz x de 3 elementos, que armazena três valores: 2, 3 e 4. Ele adiciona os valores na matriz e exibe a soma 9 -
section .text
global _start ;must be declared for linker (ld)
_start:
mov eax,3 ;number bytes to be summed
mov ebx,0 ;EBX will store the sum
mov ecx, x ;ECX will point to the current element to be summed
top: add ebx, [ecx]
add ecx,1 ;move pointer to next element
dec eax ;decrement counter
jnz top ;if counter not 0, then loop again
done:
add ebx, '0'
mov [sum], ebx ;done, store result in "sum"
display:
mov edx,1 ;message length
mov ecx, sum ;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
global x
x:
db 2
db 4
db 3
sum:
db 0
Quando o código acima é compilado e executado, ele produz o seguinte resultado -
9