GNU/Linux xterm bash 165 views

Este código en ARM64 está diseñado para imprimir una secuencia de números, comenzando desde el número 2 y aumentando de 2 en 2, hasta llegar a 48 (inclusive). Cada número se convierte a su representación en texto (ASCII), y luego se imprime en la consola. A continuación, explico cada parte del código detalladamente:

1. Sección de datos

.section .data
buffer: .skip 16                 // Espacio para la cadena del número y '\n'
  • buffer: Reserva un espacio de 16 bytes en la memoria donde se almacenará el número convertido a su representación en cadena, más un salto de línea (\n) al final.

2. Sección de texto (código)

.section .text
.global _start
  • _start: Define el punto de entrada del programa, desde donde comienza la ejecución del código.

3. Inicio del programa (_start)

_start:
    mov x19, #2                  // x19 = contador (i = 2)
  • x19: Se inicializa con el valor 2. Este valor es el primer número que se imprimirá. El programa incrementará este contador de 2 en 2 durante el ciclo.

4. Bucle principal (loop)

loop:
    // Convertir entero a cadena (itoa)
    mov x0, x19                  // x0 = número actual
    ldr x1, =buffer              // x1 = puntero al buffer
    bl int_to_str                // llama a función itoa
  • mov x0, x19: Pone el valor actual de x19 (el número a convertir) en el registro x0.
  • ldr x1, =buffer: Carga la dirección de la variable buffer en el registro x1.
  • bl int_to_str: Llama a la subrutina int_to_str, que convierte el número en x0 a una cadena ASCII y lo guarda en el buffer apuntado por x1.

5. Escribir en consola

    mov x8, #64                  // syscall write
    mov x0, #1                   // stdout
    ldr x1, =buffer              // buffer a escribir
    mov x2, #3                   // longitud = 2 dígitos + '\n'
    svc #0
  • mov x8, #64: Configura la llamada al sistema (syscall) para escribir en la consola (write).
  • mov x0, #1: Pone 1 en x0, que es el descriptor de archivo para stdout (la salida estándar).
  • ldr x1, =buffer: Carga la dirección del buffer donde se almacenó la cadena convertida.
  • mov x2, #3: Establece la longitud de la cadena a escribir en 3 (2 dígitos del número + 1 byte para el salto de línea \n).
  • svc #0: Realiza la llamada al sistema para escribir la cadena en la consola.

6. Incrementar contador y continuar el bucle

    add x19, x19, #2             // i += 2
    cmp x19, #48
    ble loop                     // repetir si i <= 48
  • add x19, x19, #2: Incrementa x19 en 2, por lo que x19 toma los valores 2, 4, 6, 8, …, hasta 48.
  • cmp x19, #48: Compara x19 con 48.
  • ble loop: Si x19 es menor o igual a 48, el programa salta de nuevo al inicio del bucle (loop) y continúa con el siguiente número.

7. Salir del programa

    mov x8, #93                  // syscall exit
    mov x0, #0                   // status 0
    svc #0
  • mov x8, #93: Prepara la llamada al sistema para salir del programa (exit), usando el número de syscall 93.
  • mov x0, #0: Configura x0 con el valor 0, indicando que el programa termina correctamente.
  • svc #0: Realiza la llamada al sistema para salir del programa.

8. Subrutina: int_to_str (convertir entero a cadena ASCII)

int_to_str:
    mov x2, #10
    udiv x3, x0, x2              // x3 = dígito alto
    msub x4, x3, x2, x0          // x4 = dígito bajo
  • mov x2, #10: Configura x2 con el valor 10, que es el divisor para convertir el número en base 10 (decimal).
  • udiv x3, x0, x2: Divide el número x0 entre 10. El cociente (dígito alto) se guarda en x3.
  • msub x4, x3, x2, x0: Calcula el residuo de la división (dígito bajo) y lo almacena en x4.
    add x3, x3, #'0'             // convertir a ASCII
    add x4, x4, #'0'
  • add x3, x3, #’0’: Convierte el dígito alto (almacenado en x3) a su valor ASCII sumando el valor ASCII de '0'.
  • add x4, x4, #’0’: Convierte el dígito bajo (almacenado en x4) a su valor ASCII.
    strb w3, [x1]                // guardar primer carácter
    strb w4, [x1, #1]            // segundo carácter
    mov w5, #'\n'
    strb w5, [x1, #2]            // salto de línea
    ret
  • strb w3, [x1]: Almacena el primer carácter (el dígito alto convertido a ASCII) en el buffer.
  • strb w4, [x1, #1]: Almacena el segundo carácter (el dígito bajo convertido a ASCII) en el buffer.
  • mov w5, #’\n’: Prepara el carácter de salto de línea (ASCII 10) en w5.
  • strb w5, [x1, #2]: Almacena el salto de línea al final de la cadena en el buffer.
  • ret: Regresa de la subrutina.

Resumen del funcionamiento del programa:

  1. El programa comienza con el número 2 y repite un ciclo donde convierte el número a su representación en cadena (usando la subrutina int_to_str), lo imprime en la consola, y luego incrementa el número en 2.
  2. El ciclo continúa hasta que x19 alcanza el valor 50. En cada iteración, el número se convierte en una cadena de caracteres, se imprime con un salto de línea, y el contador x19 se incrementa.
  3. Al finalizar el ciclo, el programa termina con una llamada al sistema para salir con el estado 0.

Este código imprime la secuencia de números: 2, 4, 6, …, 48, cada uno en su propia línea.