GNU/Linux xterm bash 160 views

Este ejemplo convierte una letra numérica (como '5') ingresada por el usuario a su valor entero (5).


🧠 ¿Qué hace este programa?

  1. Muestra un mensaje pidiendo una letra numérica.
  2. Lee un carácter desde el teclado.
  3. Convierte ese carácter de tipo char (ASCII) a un número int.
  4. Muestra el número resultante en consola.

📦 Sección .data — Datos usados por el programa

msg_ingreso:    .string "Ingrese la letra a convertir a entero: "
msg_resultado:  .string "El valor entero es: %d\n"
formato_char:   .string " %c"      // Espacio para ignorar ENTER o espacio previo
buffer:         .skip 2            // Reservamos 2 bytes para el carácter (1 + 1 por seguridad)
  • msg_ingreso: Cadena que se muestra para pedir el carácter.
  • msg_resultado: Cadena con formato para imprimir el número entero.
  • formato_char: Cadena usada por scanf. El espacio antes de %c es importante, evita que se lea un ENTER anterior.
  • buffer: Espacio reservado en memoria para guardar el carácter ingresado.

🧾 Sección .text — Código ejecutable

.global main
.align 2
  • main: Punto de entrada del programa.
  • .align 2: Alinea el código a una dirección múltiplo de 4 bytes (recomendado por rendimiento).

🔧 Prólogo — Preparar el Stack Frame

main:
    stp     x29, x30, [sp, -16]!  // Guardar FP (x29) y LR (x30)
    mov     x29, sp               // Nuevo Frame Pointer

🖨️ Mostrar mensaje

    adr     x0, msg_ingreso       // Dirección del string en x0
    bl      printf
  • adr coloca la dirección del mensaje en x0 (primer parámetro de printf).
  • Se llama a printf para mostrarlo.

⌨️ Leer el carácter

    adr     x0, formato_char      // "%c"
    adr     x1, buffer            // Donde guardar el carácter
    bl      scanf
  • scanf("%c", buffer) para leer un único carácter y guardarlo en buffer.

🔢 Convertir ASCII a entero

    adr     x0, buffer
    ldrb    w0, [x0]              // Lee el byte del buffer (carácter)
    sub     w0, w0, #48           // ASCII '0' = 48 → '5' - 48 = 5
  • ldrb: carga 1 byte (char) como entero sin signo.
  • Se le resta 48 ('0' en ASCII) para obtener el valor real del dígito.

📤 Mostrar el resultado

    mov     w1, w0                // Mover resultado a w1 (segundo argumento de printf)
    adr     x0, msg_resultado
    bl      printf
  • w1: contiene el valor entero.
  • x0: contiene el string de formato.
  • Llama a printf("El valor entero es: %d\n", valor);

🧹 Epílogo — Restaurar stack y salir

    mov     w0, #0                // Código de salida
    ldp     x29, x30, [sp], 16    // Restaurar FP y LR
    ret                           // Retornar a Linux

🧪 Ejemplo de uso

./convertir
Ingrese la letra a convertir a entero: 7
El valor entero es: 7

❗ Nota importante

Este programa solo funciona correctamente con dígitos del 0 al 9. Si el usuario mete una letra como 'A', obtendrás un valor erróneo ('A' = 65 → 65 - 48 = 17).