algoritmo de endereçamento de uma memória de matrizes triangulares usando assembly
Eu estava fazendo um projeto em ASM sobre triângulo pascal usando NASM
Portanto, no projeto, você precisa calcular o triângulo pascal da linha 0 à linha 63
meu primeiro problema é onde armazenar os resultados do cálculo -> memória
segundo problema, que tipo de armazenamento eu uso na memória, para entender o que quero dizer, tenho três maneirasprimeiro declarar ummatrizes completas então será assim
memoryLabl: resd 63*64 ; 63 rows of 64 columns each
mas o problema dessa maneira que metade das matrizes não são usadas que fazem meu programanão eficiente então vamos o segundo método está disponível
que é declarado para cada linha um rótulo para memóriapor exemplo :
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
essa maneira de fazer é como fazer à mão,
alguns outros da classe tentam usar macro, como você pode veraqui mas eu não entendo
Por enquanto, tudo bem
vamos para o último que eu usei, que é como o primeiro, mas eu uso ummatrizes triangulares , como é que, declarando apenas a quantidade de memória que eu preciso
então, para armazenar a linha 0 à linha 63 linha do triângulo pascal, é uma matriz de triângulo porque cada nova linha eu adiciono uma célula
Eu aloque 2080 dword para as matrizes triangulares como é isso ?? explique até 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
Eu dei a cada número 1 dword
okey agora criamos a memória para armazenar resultados, vamos começar o cálculo
primeiro# no triângulo pascal você tem todas as célulaslinha 0 tem valor 1
Farei isso em pseudo-código para que você entenda como eu coloco um em todas as células da linha 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 no triângulo pascal é ter oúltima linha de cada linha igual a 1
Vou usar pseudo código para simplificar
s=0
for(i=2;i<64;i++):
s = s+i
mov dword[x+s*4],1
Eu começo de i igual a 2 porque i = 0 (i = 1) é a linha0 (linha1) e a linha0 (linha1) está cheia porque mantém apenas um valor (reboque), como digo na explicação acima
então o pseudo código de reboque fará meu retângulo parecerem memória :
1
1 1
1 1
1 1
1 1
1 1
1 1
1 1
1 1
1 1
...
1 1
agora vem a parte difícil é o cálculo usando esse valor no triângulo para preencher todas as células do triângulo
vamos começar com a ideia aqui
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]
meu problema Não consegui quebrar essa relação usando a instrução ASM porque tenho um
matrizes triangulares com as quais é estranho trabalhar, alguém pode me ajudar a quebrá-lo usando uma relação ou pseudo-código ou código ASM muito básico?