GNU/Linux xterm-256color zsh 132 views

.section .data
buffer:     .skip 16              // Espacio para guardar el resultado en texto

.section .text
.global _start

_start:
    // Paso 1: Cargar los dos números (60 y 68)
    mov x1, #60                  // x1 = 60
    mov x2, #68                  // x2 = 68

    // Paso 2: Sumar los dos números
    add x3, x1, x2               // x3 = x1 + x2 = 128

    // Paso 3: Dividir entre 2 (media)
    mov x4, #2
    udiv x0, x3, x4              // x0 = x3 / 2 = 64

    // Paso 4: Convertir el resultado a texto (itoa)
    ldr x1, =buffer              // x1 apunta al buffer
    bl itoa                      // convierte x0 → string en buffer

    // Paso 5: Imprimir el resultado con syscall write
    mov x0, #1                   // x0 = STDOUT
    ldr x1, =buffer              // x1 = puntero al string
    bl strlen                    // x0 = longitud
    mov x2, x0                   // x2 = longitud
    mov x0, #1                   // stdout otra vez
    mov x8, #64                  // syscall write
    svc 0

    // Paso 6: Finalizar el programa
    mov x8, #93
    mov x0, #0
    svc 0

// ----------------------- strlen -----------------------
strlen:
    // Entrada: x1 = puntero al string
    // Salida: x0 = longitud del string
    mov x2, x1
.loop:
    ldrb w3, [x2], #1
    cmp w3, #0
    b.ne .loop
    sub x0, x2, x1
    ret

// ----------------------- itoa -----------------------
itoa:
    // Entrada: x0 = número entero a convertir
    //          x1 = buffer destino
    // Salida:  buffer contiene el número como string

    mov x2, x0               // x2 = número a convertir
    mov x3, x1               // x3 = puntero base
    add x4, x1, #10          // x4 = final del buffer
    mov x5, #10
    strb w5, [x4]            // '\n'
    mov x5, #0
    strb w5, [x4, #1]        // '\0'
    mov x6, x4

.itoa_loop:
    mov x5, #10
    udiv x0, x2, x5
    msub x5, x0, x5, x2      // x5 = x2 - (x0 * 10)
    add x5, x5, #'0'         // convertir a ASCII
    sub x6, x6, #1
    strb w5, [x6]            // guardar carácter
    mov x2, x0
    cbnz x2, .itoa_loop

.copy_loop:
    ldrb w5, [x6], #1
    strb w5, [x1], #1
    cmp w5, #0
    b.ne .copy_loop
    ret