2.3.3 Determinante da matriz de 2x2

float asm_matdet(float mat[2][2])

Wolfram Mathematica Determinante de uma Matriz Quadrada de 2x2
Wolfram Mathematica Determinante de uma Matriz Quadrada de 2x2

Retorna do determinante de uma matriz quadrada de 2 x 2.

/**
 * @file    asm_matdet.s
 * @author  Reficio
 * @version 1.0
 * 
 * @section DESCRIPTION
 *
 * Função para calcular o determinante de uma matriz quadrada de 2 x 2.
 *
 * Pela fórmula de Leibniz o determinante da matriz quadrada de 2 x 2 é:
 *
 *        | a   b |
 *  |A| = |       | = ad - bc
 *        | c   d |
 *
 *         Descrição                    Registrador
 * @param  Endereço da matriz              (R0)
 * @return Determinante da matriz          (S0)
 *
 * @see https://en.wikipedia.org/wiki/2_×_2_real_matrices
 */

// Nova sintaxe unificada

.syntax unified

// Dados 

.data

// Código

.text
.global asm_matdet
.type asm_matdet, %function

asm_matdet:

        FLDS    S1, [R0]        // S1 = a
        FLDS    S2, [R0, 4]     // S2 = b
        FLDS    S3, [R0, 8]     // S3 = c
        FLDS    S4, [R0, 12]    // S4 = d
        FMULS   S5, S1, S4      // S5 = ad
        FMULS   S6, S2, S3      // S6 = bc
        FSUBS   S0, S5, S6      // S0 = ad - bc

end:

        MOV     PC, LR          // Retornar

Programa em C para testar a função:

/**
 * @file    matdet.c
 * @author  Reficio
 * @version 1.0
 * 
 * @section DESCRIPTION
 * 
 * Este programa tem por finalidade chamar a função "asm_matdet",
 * que retorna o determinante da matriz quadrada de 2 x 2 passada
 * como parâmetro, para fins de teste da função.
 * 
 */

#include <stdio.h>

extern float asm_matdet(float mat[2][2]);

void print(float mat[2][2]) {
        
        int linha, coluna;

        for (linha = 0; linha < 2; linha++) {
                for (coluna = 0; coluna < 2; coluna++) {
                        printf("%10.4f", mat[linha][coluna]);
                }
                printf("\n");
        }

        return;
}

void main () {
        float det;
        float mat[2][2] = {{1.25, -2.75}, {3.15, 4.65}};
        // Mostrar a matriz
        printf("Matriz\n");
        print(mat);
        // Calcular o determinante da matriz
        det = asm_matdet(mat);
        printf("Determinante\n%10.4f\n", det);
}

Makefile:

matdet: matdet.c asm_matdet.s
	gcc -o matdet matdet.c asm_matdet.s
clean:
	rm matdet

Construção e execução:

pi@raspberrypi:~/raspbered/assembly/mat_det_2x2 $ make clean
rm matdet

pi@raspberrypi:~/raspbered/assembly/mat_det_2x2 $ make
gcc -o matdet matdet.c asm_matdet.s

pi@raspberrypi:~/raspbered/assembly/mat_det_2x2 $ ./matdet 
Matriz
    1.2500   -2.7500
    3.1500    4.6500
Determinante
   14.4750