**
Nombre: trian.s
Autor: Karla Itzel Vázquez Cruz
Fecha: 10-04-2025
Descripción: Area del Triangulo
Plataforma: Raspberry Pi OS 64-bit
Asciinema: trian.s
Versión en C:
float area_triangulo(float base, float altura) {
return (base * altura) / 2;
}
Versión en ARM64 RaspbianOS Linux:
.equ STDOUT, 1 // Descriptor de archivo para salida estándar
.equ WRITE, 64 // Número de syscall para write
.equ EXIT, 93 // Número de syscall para exit
// Valores del triángulo (base y altura)
.equ BASE, 12 // Base del triángulo
.equ ALTURA, 6 // Altura del triángulo
// Datos para los mensajes
.section .data
mensaje:
.ascii "El área del triángulo (base="
.equ len_mensaje, . - mensaje
base_str:
.ascii "x"
.equ len_base_str, . - base_str
.ascii ", altura="
altura_str:
.ascii "x"
.equ len_altura_str, . - altura_str
.ascii ") es: "
area_str:
.ascii "x\n"
.equ len_area_str, . - area_str
.section .text
.global _start
_start:
// Calcular el área (base × altura / 2)
mov x0, #BASE // Cargar base en x0
mov x1, #ALTURA // Cargar altura en x1
mul x2, x0, x1 // x2 = base × altura
lsr x2, x2, #1 // x2 = x2 / 2 (área)
// Convertir valores a strings ASCII
mov x0, #BASE
adr x1, base_str
bl int_to_ascii
mov x0, #ALTURA
adr x1, altura_str
bl int_to_ascii
mov x0, x2 // Área calculada
adr x1, area_str
bl int_to_ascii
// Escribir el mensaje completo
mov x8, #WRITE // Syscall write
mov x0, #STDOUT // Descriptor de archivo (stdout)
adr x1, mensaje // Puntero al mensaje
mov x2, #len_mensaje // Longitud
svc 0
// Escribir la base
mov x8, #WRITE
mov x0, #STDOUT
adr x1, base_str
mov x2, #len_base_str
svc 0
// Escribir ", altura="
adr x1, mensaje + len_mensaje
mov x2, #10 // Longitud de ", altura="
svc 0
// Escribir la altura
mov x8, #WRITE
mov x0, #STDOUT
adr x1, altura_str
mov x2, #len_altura_str
svc 0
// Escribir ") es: "
adr x1, mensaje + len_mensaje + 9 + len_altura_str
mov x2, #7 // Longitud de ") es: "
svc 0
// Escribir el área
mov x8, #WRITE
mov x0, #STDOUT
adr x1, area_str
mov x2, #len_area_str
svc 0
// Salir del programa
mov x8, #EXIT // Syscall exit
mov x0, #0 // Código de salida 0 (éxito)
svc 0
// Rutina para convertir entero (0-99) a string ASCII de 2 dígitos
// Entrada: x0 = número, x1 = puntero a buffer de salida (2 bytes)
int_to_ascii:
mov x2, #10 // Divisor
udiv x3, x0, x2 // x3 = x0 / 10 (dígito decenas)
msub x4, x3, x2, x0 // x4 = x0 % 10 (dígito unidades)
add x3, x3, #'0' // Convertir a ASCII
add x4, x4, #'0'
strb w3, [x1] // Almacenar decenas
strb w4, [x1, #1] // Almacenar unidades
ret // Retornar