GNU/Linux xterm bash 174 views

Este programa en ARM64 para Raspberry Pi OS calcula la longitud de una cadena ingresada por el usuario (como lo haría strlen en C), y luego imprime cuántos caracteres contiene la cadena.


🧠 ¿Qué hace este programa?

  1. Muestra un mensaje pidiendo una cadena de texto.
  2. La lee completa (incluso con espacios) hasta que detecta un salto de línea (ENTER).
  3. Recorre la cadena carácter por carácter hasta encontrar el NULL terminator (0x00), y cuenta la longitud.
  4. Imprime la longitud.

🗂️ .data — Segmento de datos

msg_ingreso:    .string "Ingrese una cadena: "
msg_resultado:  .string "La longitud de la cadena es: %d\n"
buffer:         .skip 100
formato_str:    .string "%[^\n]"
  • msg_ingreso: mensaje que aparece al pedir la cadena.
  • msg_resultado: se usa con printf para mostrar el número de caracteres.
  • buffer: espacio para almacenar hasta 99 caracteres + 1 terminador null (.skip 100).
  • formato_str: patrón de scanf para leer toda la línea hasta que se presione ENTER.

🧾 .text — Lógica del programa

🔧 Prólogo

stp x29, x30, [sp, -16]!
mov x29, sp
  • Crea el stack frame estándar.

⌨️ Leer cadena

adr x0, msg_ingreso
bl printf

adr x0, formato_str
adr x1, buffer
bl scanf
  • Imprime: "Ingrese una cadena: ".
  • Lee una línea completa, incluyendo espacios, hasta que se presione ENTER.

🔢 Calcular longitud

adr x0, buffer
mov x1, #0
  • x0: apunta al inicio del buffer.
  • x1: se usa como índice / contador de longitud.

🔁 Bucle para contar caracteres

contar_loop:
    ldrb w2, [x0, x1]     // Cargar el byte actual
    cbz  w2, fin_conteo   // ¿Es 0? Fin de la cadena
    add  x1, x1, #1       // Si no, incrementa contador
    b    contar_loop
  • Recorre la cadena carácter por carácter (como en C: while (*ptr != '\0')).
  • Cada carácter no-nulo suma uno al contador.

🖨️ Imprimir resultado

adr x0, msg_resultado
bl printf
  • Imprime: "La longitud de la cadena es: %d\n"
  • El registro x1 ya contiene el resultado y se pasa implícitamente a printf como segundo argumento (w1).

🧹 Epílogo y salida

mov w0, #0
ldp x29, x30, [sp], 16
ret
  • Finaliza el programa limpiamente.

🧪 Ejemplo de uso

$ ./strlen
Ingrese una cadena: hola mundo
La longitud de la cadena es: 10

✅ ¿Qué técnicas usa?

  • scanf("%[^\n]"): lectura segura de strings con espacios (clave para capturar frases).
  • ldrb: carga byte por byte, ideal para manipulación de texto ASCII.
  • Contador manual tipo strlen, sin usar funciones estándar.