GNU/Linux xterm-256color zsh 133 views

.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