algoritmo de direccionamiento de una memoria de matrices triangulares usando ensamblaje
Estaba haciendo un proyecto en ASM sobre el triángulo pascal usando NASM
entonces en el proyecto necesitas calcular el triángulo pascal de la línea 0 a la línea 63
mi primer problema es dónde almacenar los resultados del cálculo -> memoria
segundo problema, qué tipo de almacenamiento utilizo en la memoria, para entender a qué me refiero tengo 3 víasprimero declarar unmatrices completas así será así
memoryLabl: resd 63*64 ; 63 rows of 64 columns each
pero el problema de esta manera es que no se usa la mitad de las matrices que hacen que mi programano eficiente así que vamos, el segundo método está disponible
que se declara para cada línea una etiqueta para la memoriapor ejemplo :
line0: dd 1
line1: dd 1,1
line2: dd 1,2,1 ; with pre-filled data for example purposes
...
line63: resd 64 ; reserve space for 64 dword entries
esta forma de hacerlo es como hacerlo a mano,
otro de la clase intenta usar macro como puedes veraquí pero no lo entiendo
hasta ahora tan bueno
vamos al último que he usado, que es como el primero pero uso unmatrices triangulares , cómo es eso, al declarar solo la cantidad de memoria que necesito
así que para almacenar la línea 0 a la línea 63 del triángulo pascal, me da un triángulo matrices porque cada nueva línea agrego una celda
He asignado 2080 dword para las matrices de triángulos, ¿cómo es eso? explicar para 2080 dword:
okey we have line0 have 1 dword /* 1 number in first line */
line1 have 2 dword /* 2 numbers in second line */
line2 have 3 dword /* 3 numbers in third line */
...
line63 have 64 dword /* 64 numbers in final line*/
so in the end we have 2080 as the sum of them
Le doy a cada número 1 dword
okey, ahora hemos creado la memoria para almacenar resultados, comencemos el cálculo
primero# en el triángulo pascal tienes todas las celdas enfila 0 tener valor 1
Lo haré en pseudocódigo para que entiendas cómo pongo uno en todas las celdas de la fila 0:
s=0
for(i=0;i<64;i++):
s = s+i
mov dword[x+s*4],1 /* x is addresses of triangle matrices */
segunda parte en el triángulo pascal es tener elúltima fila de cada línea igual a 1
Usaré pseudocódigo para hacerlo simple
s=0
for(i=2;i<64;i++):
s = s+i
mov dword[x+s*4],1
Comienzo desde i igual a 2 porque i = 0 (i = 1) es line0 (line1) y line0 (line1) está lleno porque solo tiene un valor (tow) como digo en la explicación anterior
así que el pseudocódigo de remolque hará que mi rectángulo se vea comoen memoria :
1
1 1
1 1
1 1
1 1
1 1
1 1
1 1
1 1
1 1
...
1 1
ahora viene la parte difícil es el cálculo usando este valor en triángulo para llenar todas las celdas del triángulo
comencemos con la idea aquí
let's take cell[line][row]
we have cell[2][1] = cell[1][0]+cell[1][1]
and cell[3][1]= cell[2][0]+cell[2][1]
cell[3][2]= cell[2][1]+cell[2][2]
in **general** we have
cell[line][row]= cell[line-1][row-1]+cell[line-1][row]
mi problema No pude romper esta relación usando la instrucción ASM porque tengo un
matrices triangulares con las que es extraño trabajar, ¿alguien puede ayudarme a romperlo usando una relación o un pseudocódigo o un código asm muy básico?