.section .data
msg: .asciz "Perimetro: "
buffer_a: .space 8
buffer_b: .space 8
buffer_c: .space 8
result_buf: .space 8
newline: .asciz "\n"
.section .text
.global _start
_start:
// ---------------------------
// Leer lado a
// ---------------------------
mov x0, #0
ldr x1, =buffer_a
mov x2, #8
mov x8, #63 // syscall read
svc 0
// Convertir ASCII a número (lado a)
ldr x1, =buffer_a
bl ascii_to_int
mov w19, w0 // w19 = a
// ---------------------------
// Leer lado b
// ---------------------------
mov x0, #0
ldr x1, =buffer_b
mov x2, #8
mov x8, #63
svc 0
// Convertir ASCII a número (lado b)
ldr x1, =buffer_b
bl ascii_to_int
mov w20, w0 // w20 = b
// ---------------------------
// Leer lado c
// ---------------------------
mov x0, #0
ldr x1, =buffer_c
mov x2, #8
mov x8, #63
svc 0
// Convertir ASCII a número (lado c)
ldr x1, =buffer_c
bl ascii_to_int
mov w21, w0 // w21 = c
// ---------------------------
// Calcular perímetro: a + b + c
// ---------------------------
add w22, w19, w20 // a + b
add w22, w22, w21 // + c → w22
// ---------------------------
// Convertir resultado a ASCII
// ---------------------------
mov w0, w22
ldr x1, =result_buf
bl int_to_ascii
// ---------------------------
// Mostrar mensaje
// ---------------------------
mov x0, #1
ldr x1, =msg
mov x2, #11
mov x8, #64
svc 0
// Mostrar número convertido
mov x0, #1
ldr x1, =result_buf
mov x2, #8
mov x8, #64
svc 0
// Salto de línea
mov x0, #1
ldr x1, =newline
mov x2, #1
mov x8, #64
svc 0
// ---------------------------
// Salida limpia
// ---------------------------
mov x0, #0
mov x8, #93
svc 0
// -------------------------------------------------------------
// ascii_to_int
// Convierte buffer ASCII a número entero positivo
// Entrada: x1 → puntero a buffer
// Salida: w0 → número convertido
// -------------------------------------------------------------
ascii_to_int:
mov w0, #0
mov w2, #0
mov w3, #10 // base 10
parse_loop:
add x4, x1, x2
ldrb w5, [x4]
cmp w5, #'0'
blt end_parse
cmp w5, #'9'
bgt end_parse
sub w5, w5, #'0'
mul w0, w0, w3
add w0, w0, w5
add w2, w2, #1
b parse_loop
end_parse:
ret
// -------------------------------------------------------------
// int_to_ascii
// Convierte entero positivo a cadena ASCII
// Entrada: w0 = número, x1 = buffer destino
// -------------------------------------------------------------
int_to_ascii:
mov x2, #10
mov x3, x1 // inicio del buffer
mov x4, #0 // contador de dígitos
convert_loop:
udiv x5, x0, x2
msub x6, x5, x2, x0 // x6 = x0 - (x5 * 10)
add x6, x6, #'0'
strb w6, [x1], #1
add x4, x4, #1
mov x0, x5
cbz x0, reverse_ascii
b convert_loop
reverse_ascii:
sub x1, x1, x4 // volver al inicio
mov x5, #0
reverse_loop:
cmp x5, x4
bge done_ascii
sub x4, x4, #1
ldrb w6, [x1, x5]
ldrb w7, [x1, x4]
strb w7, [x1, x5]
strb w6, [x1, x4]
add x5, x5, #1
b reverse_loop
done_ascii:
ret