2.2.5 Raiz Quadrada

double asm_sqrt(double x)

A função double asm_sqrt(double x) retorna a raiz quadrada de x

/**
 * @file    asm_sqrt.s
 * @author  Reficio
 * @version 1.0
 * 
 * @section DESCRIPTION
 *
 * Raiz quadrada
 *
 * A função "double asm_sqrt(double x)" retorna a raiz quadrada de x.
 *
 *            Nome    Tipo     Descrição              Registrador
 * @param       x     double   número                     (D0)
 * @return            double   raiz quadrada de x         (D0)
 *
 * A instrução FSQRTD (raiz quadrada de ponto flutuante, precisão dupla)
 * calcula a raiz quadrada do valor em um registrador de precisão dupla
 * e escreve o resultado em outro registrador de precisão dupla.
 * Também pode executar uma versão vetorial desta operação.
 *
 * @see https://www.tutorialspoint.com/c_standard_library/c_function_sqrt
 */

// Nova sintaxe unificada

.syntax unified

// Dados 

.data

// Código

.text
.global asm_sqrt
.type asm_sqrt, %function

asm_sqrt:

        FSQRTD  D0, D0  // D0 = raiz quadrada de D0

end:

        MOV     PC, LR  // Retornar

Programa em C para testar a função:

/**
 * @file    sqrt.c
 * @author  Reficio
 * @version 1.0
 * 
 * @section DESCRIPTION
 * 
 * Este programa tem por finalidade chamar a função "asm_sqrt",
 * que retorna o cálculo da raiz quadrada seu parâmetro, para
 * fins de teste da função.
 * 
 */

#include <stdio.h>
#include <math.h>

extern double asm_sqrt(double x);

int main () {

    printf("Número     Biblioteca C         Assembly\n");
    printf("%6.2lf %16.12lf %16.12lf\n", 2.0, sqrt(2.0), asm_sqrt(2.0) );
    printf("%6.2lf %16.12lf %16.12lf\n", 4.0, sqrt(4.0), asm_sqrt(4.0) );

   return(0);
}

Makefile:

sqrt: sqrt.c asm_sqrt.s
	gcc -o sqrt sqrt.c asm_sqrt.s
clean:
	rm sqrt

Construção e execução:

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

pi@raspberrypi:~/raspbered/assembly/sqrt $ make
gcc -o sqrt sqrt.c asm_sqrt.s

pi@raspberrypi:~/raspbered/assembly/sqrt $ ./sqrt 
Número     Biblioteca C         Assembly
  2.00   1.414213562373   1.414213562373
  4.00   2.000000000000   2.000000000000