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