Ensamblaje: matrices

Ya hemos comentado que las directivas de definición de datos para el ensamblador se utilizan para asignar almacenamiento para variables. La variable también podría inicializarse con algún valor específico. El valor inicializado se puede especificar en formato hexadecimal, decimal o binario.

Por ejemplo, podemos definir una variable de palabra 'meses' de cualquiera de las siguientes formas:

MONTHS	DW	12
MONTHS	DW	0CH
MONTHS	DW	0110B

Las directivas de definición de datos también se pueden utilizar para definir una matriz unidimensional. Definamos una matriz unidimensional de números.

NUMBERS	DW  34,  45,  56,  67,  75, 89

La definición anterior declara una matriz de seis palabras, cada una inicializada con los números 34, 45, 56, 67, 75, 89. Esto asigna 2x6 = 12 bytes de espacio de memoria consecutiva. La dirección simbólica del primer número será NÚMEROS y la del segundo número será NÚMEROS + 2 y así sucesivamente.

Tomemos otro ejemplo. Puede definir una matriz denominada inventario de tamaño 8 e inicializar todos los valores con cero, como:

INVENTORY   DW  0
            DW  0
            DW  0
            DW  0
            DW  0
            DW  0
            DW  0
            DW  0

Que se puede abreviar como -

INVENTORY   DW  0, 0 , 0 , 0 , 0 , 0 , 0 , 0

La directiva TIMES también se puede utilizar para múltiples inicializaciones con el mismo valor. Usando TIEMPOS, la matriz INVENTARIO se puede definir como:

INVENTORY TIMES 8 DW 0

Ejemplo

El siguiente ejemplo demuestra los conceptos anteriores definiendo una matriz de 3 elementos x, que almacena tres valores: 2, 3 y 4. Agrega los valores en la matriz y muestra la suma 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

Cuando se compila y ejecuta el código anterior, produce el siguiente resultado:

9