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