GNU/Linux xterm-256color bash 148 views

/*
Autor: Victor Manuel Madrid Lugo
Fecha: 08/04/2025
Descripción: Valida si una cadena contiene solo letras (a-z, A-Z)
Demostración: [https://asciinema.org/a/462MXDhRDQPLIRc99AVf1wFpQ]

Equivalente en C#:
bool SoloLetras(string texto) {
    foreach (char c in texto) {
        if (!char.IsLetter(c)) {
            return false;
        }
    }
    return texto.Length > 0;
}
*/

.section .data
    msg_prompt:    .asciz "Ingrese una cadena: "
    msg_true:      .asciz "La cadena contiene SOLO letras.\n"
    msg_false:     .asciz "La cadena contiene otros caracteres.\n"
    newline:       .asciz "\n"
    buffer:        .skip 256

.section .text
.global _start

_start:
    // Mostrar mensaje
    mov x0, #1
    ldr x1, =msg_prompt
    mov x2, #19
    mov x8, #64
    svc #0

    // Leer entrada
    mov x0, #0
    ldr x1, =buffer
    mov x2, #256
    mov x8, #63
    svc #0

    // Inicializar variables
    mov x19, #0          // Índice
    ldr x20, =buffer     // Puntero
    mov x21, #0          // Contador de letras
    mov x22, #0          // Flag: 1 = tiene no-letras

check_loop:
    ldrb w23, [x20, x19] // Cargar carácter
    cbz w23, check_empty // Fin si es null
    cmp w23, #10         // Ignorar newline
    beq check_empty

    // Verificar si es letra (a-z o A-Z)
    // Primero verificar mayúsculas (A-Z)
    cmp w23, #'A'
    b.lt not_letter
    cmp w23, #'Z'
    b.le is_letter

    // Luego verificar minúsculas (a-z)
    cmp w23, #'a'
    b.lt not_letter
    cmp w23, #'z'
    b.gt not_letter

is_letter:
    add x21, x21, #1     // Incrementar contador
    b next_char

not_letter:
    mov x22, #1          // Marcar que tiene no-letras

next_char:
    add x19, x19, #1
    b check_loop

check_empty:
    // Verificar si tenía no-letras o si está vacío
    cbnz x22, print_false
    cbz x21, print_false

print_true:
    mov x0, #1
    ldr x1, =msg_true
    mov x2, #30
    mov x8, #64
    svc #0
    b exit

print_false:
    mov x0, #1
    ldr x1, =msg_false
    mov x2, #35
    mov x8, #64
    svc #0

exit:
    // Salir
    mov x0, #0
    mov x8, #93
    svc #0