**
Nombre: recrat.s
Autor: Karla Itzel Vázquez Cruz
Fecha: 10-04-2025
Descripción: Area del rectangulo
Plataforma: Raspberry Pi OS 64-bit
Asciinema: recrat.s
Versión en C:
#include <stdio.h>
int main() {
int base, altura;
printf("Introduce la base: ");
scanf("%d", &base);
printf("Introduce la altura: ");
scanf("%d", &altura);
int area = base * altura;
printf("El área del rectángulo (base=%d, altura=%d) es: %d\n", base, altura, area);
return 0;
}
Versión en ARM64 RaspbianOS Linux:
.equ STDIN, 0
.equ STDOUT, 1
.equ READ, 63
.equ WRITE, 64
.equ EXIT, 93
.section .bss
base_input: .skip 8
altura_input: .skip 8
area_str: .skip 4
.section .data
prompt_base: .ascii "Introduce la base: "
len_prompt_base = . - prompt_base
prompt_altura: .ascii "Introduce la altura: "
len_prompt_altura = . - prompt_altura
msg_resultado: .ascii "El área del rectángulo es: "
len_msg_resultado = . - msg_resultado
newline: .ascii "\n"
len_newline = . - newline
.section .text
.global _start
_start:
// ---- Pedir base ----
mov x8, #WRITE
mov x0, #STDOUT
adr x1, prompt_base
mov x2, #len_prompt_base
svc 0
// Leer base
mov x8, #READ
mov x0, #STDIN
adr x1, base_input
mov x2, #8
svc 0
// ---- Pedir altura ----
mov x8, #WRITE
mov x0, #STDOUT
adr x1, prompt_altura
mov x2, #len_prompt_altura
svc 0
// Leer altura
mov x8, #READ
mov x0, #STDIN
adr x1, altura_input
mov x2, #8
svc 0
// ---- Convertir base ASCII a entero ----
adr x0, base_input
bl ascii_to_int
mov x20, x0 // Guardar base
// ---- Convertir altura ASCII a entero ----
adr x0, altura_input
bl ascii_to_int
mov x21, x0 // Guardar altura
// ---- Calcular área = base × altura ----
mul x22, x20, x21
// ---- Mostrar mensaje ----
mov x8, #WRITE
mov x0, #STDOUT
adr x1, msg_resultado
mov x2, #len_msg_resultado
svc 0
// ---- Convertir área a ASCII ----
mov x0, x22
adr x1, area_str
bl int_to_ascii
// Mostrar área
mov x8, #WRITE
mov x0, #STDOUT
adr x1, area_str
mov x2, #4
svc 0
// ---- Salto de línea ----
mov x8, #WRITE
mov x0, #STDOUT
adr x1, newline
mov x2, #len_newline
svc 0
// ---- Salir ----
mov x8, #EXIT
mov x0, #0
svc 0
// --------------------------------------------------------------------
// Rutina: ascii_to_int
// Convierte un string ASCII decimal a entero
// Entrada: x0 -> dirección del buffer ASCII
// Salida: x0 = número entero
ascii_to_int:
mov x1, #0 // acumulador
.next_char:
ldrb w2, [x0], #1 // leer byte y avanzar
cmp w2, #'0'
blt .done
cmp w2, #'9'
bgt .done
sub x2, x2, #'0' // convertir a número
mov x3, #10
mul x1, x1, x3
add x1, x1, x2
b .next_char
.done:
mov x0, x1
ret
// --------------------------------------------------------------------
// Rutina: int_to_ascii
// Convierte entero en rango 0–9999 a ASCII
// Entrada: x0 = entero, x1 = buffer destino
int_to_ascii:
mov x2, #1000
udiv x3, x0, x2
msub x0, x3, x2, x0
add x3, x3, #'0'
strb w3, [x1]
mov x2, #100
udiv x3, x0, x2
msub x0, x3, x2, x0
add x3, x3, #'0'
strb w3, [x1, #1]
mov x2, #10
udiv x3, x0, x2
msub x0, x3, x2, x0
add x3, x3, #'0'
strb w3, [x1, #2]
add x0, x0, #'0'
strb w0, [x1, #3]
ret