2.3.4 Matriz de Hankel

void asm_hankel(int ordem, int matriz[ordem][ordem])

Wolfram Mathematica Matriz Hankel
Wolfram Mathematica Matriz Hankel

Atribuição de valores a uma matriz de Hankel quadrada com a primeira coluna na faixa de 1 a N e a última linha na faixa de N a (2 * N - 1), onde N é a ordem da matriz quadrada.

/**
 * @file    asm_hankel.s
 * @author  Reficio
 * @version 1.0
 * 
 * @section DESCRIPTION
 *
 * Função para atribuir valores a uma matriz de Hankel quadrada
 * com a primeira coluna na faixa de 1 a N e a última linha na faixa de
 * N a (2 * N - 1), onde N é a ordem da matriz quadrada.
 *
 * Uma matriz de Hankel é uma matriz que é simétrica e constante através
 * das anti-diagonais e tem elementos h(i,j) = p(i+j-1), onde o vetor
 * p = [c r(2:end)] determina completamente a matriz de Hankel.
 * (MathWorks MATLAB https://www.mathworks.com/help/matlab/ref/hankel.html)
 *
 * @param  1 ordem da matriz quadrada
 * @param  2 endereço da matriz
 * @return 0
 *
 * @see Hankel matrix https://en.wikipedia.org/wiki/Hankel_matrix
 */

// Nova sintaxe unificada

.syntax unified

// Dados 

.data

// Código

.text
.global asm_hankel
.type asm_hankel, %function

asm_hankel:

        PUSH    {R4-R11, LR}    // Salvar R4 a R11 e LR (Link Register) na pilha.

        MOV     R8, 0           // R8 = Número da Linha = i
        MOV     R9, 0           // R9 = Número da Coluna = j
        MOV     R10, R1         // R10 = Endereço da matriz
        MOV     R11, R0         // R11 = Ordem da matriz quadrada
giro:                           // Loop nos elementos da matriz
        MOV     R5, R11         // R5 = número de colunas
        MLA     R6, R8, R5, R9  // R6 = Posição na matriz = j + (i x COLUNAS)
        MOV     R6, R6, LSL 2   // R6 = R6 x 4 = Deslocamento na matriz em bytes
        MOV     R0, R10         // R0 -> Início da matriz
        ADD     R0, R0, R6      // R0 -> Posição do elemento na matriz
        ADD     R1, R8, R9      // R1 = i + j
        ADD     R1, 1           // R1 = i + j + 1 (i e j começam em zero, não em 1)
        STR     R1, [R0]        // h(i,j) = p(i+j+1)
        ADD     R9, 1           // Próxima coluna
        CMP     R9, R11         // Comparar o nº da coluna com o nº de colunas
        BLT     giro            // Se for menor processar a próxima coluna
        MOV     R9, 0           // R9 = Número da coluna = Primeira coluna
        ADD     R8, 1           // R8 = Próxima linha
        CMP     R8, R11         // Comparar o nº da linha com o nº de linhas
        BLT     giro            // Se for menor processar a próxima linha

end:

        MOV     R0, 0           // R0 = Valor retornado = 0
        POP     {R4-R11, PC}    // Trazer R4 a R11 e PC (Program Counter) da pilha.

Programa em C para testar a função:

/**
 * @file    hankel.c
 * @author  Reficio
 * @version 1.0
 * 
 * @section DESCRIPTION
 * 
 * Este programa tem por finalidade chamar a função "asm_hankel",
 * que atribui valores a uma matriz de Hankel quadrada, para fins
 * de teste da função.
 * 
 */

#include <stdio.h>

extern void asm_hankel(int ordem, int matriz[ordem][ordem]);

void print(int ordem, int matriz[ordem][ordem]) {
        
        int linha, coluna;

        for (linha = 0; linha < ordem; linha++) {
                for (coluna = 0; coluna < ordem; coluna++) {
                        printf("%4d", matriz[linha][coluna]);
                }
                printf("\n");
        }

        return;
}

void main () {
        int ordem = 10;
        int hankel [10][10];
        // Inicializar a matriz
        asm_hankel(ordem, hankel);
        // Mostrar a matriz inicializada
        print(ordem, hankel);
}

Makefile:

hankel: hankel.c asm_hankel.s
	gcc -o hankel hankel.c asm_hankel.s
clean:
	rm hankel

Construção e execução:

pi@raspberrypi:~/assembly/hankel $ make clean
rm hankel

pi@raspberrypi:~/assembly/hankel $ make
gcc -o hankel hankel.c asm_hankel.s

pi@raspberrypi:~/assembly/hankel $ ./hankel 
   1   2   3   4   5   6   7   8   9  10
   2   3   4   5   6   7   8   9  10  11
   3   4   5   6   7   8   9  10  11  12
   4   5   6   7   8   9  10  11  12  13
   5   6   7   8   9  10  11  12  13  14
   6   7   8   9  10  11  12  13  14  15
   7   8   9  10  11  12  13  14  15  16
   8   9  10  11  12  13  14  15  16  17
   9  10  11  12  13  14  15  16  17  18
  10  11  12  13  14  15  16  17  18  19