GNU/Linux xterm-256color bash 120 views

// ****************************************************************************
// * Lenguajes de Interfaz en TECNM Campus ITT
// * Nombre del archivo: practica.s
// * Descripción: Validacion de contrasena (secreta123) para el usuario
// * Autor: [America Fernanda Nevarez de la Cruz]
// * Fecha: [2025-04-07]
// * Plataforma: Raspberry Pi OS (64 bits)
// * Demostración:  [https://asciinema.org/a/Dx7E1V6IVFidNbihYW2uZxDc8]
// ****************************************************************************

// ****************************************************************************
// * Codigo equivalente en Ruby
// * print "Ingrese su contraseña: "
// * input = gets
// * input_length = input.length
// * correct_password = "secreta123\n"
// * correct_length = correct_password.length
// * if input_length != correct_length
// *    puts "Contrasena incorrecta"
// * elsif input == correct_password
// *    puts "Bienvenido"
// * else
// * puts "Contrasena incorrecta"
// * end
// ****************************************************************************

.section .bss
user_input: .skip 64

.section .data
msg_ingrese: .ascii "Ingrese su contraseña: "
len_ingrese = . - msg_ingrese

clave_correcta: .ascii "secreta123\n"
clave_len = . - clave_correcta

msg_ok: .ascii "Bienvenido\n"
len_ok = . - msg_ok

msg_fail: .ascii "Contrasena incorrecta\n"
len_fail = . - msg_fail

.section .text
.global _start

_start:
    // --- Mostrar mensaje ---
    ldr x0, =msg_ingrese
    mov x1, #len_ingrese
    bl print_msg

    // --- Leer entrada del usuario ---
    mov x0, #0
    ldr x1, =user_input
    mov x2, #64
    mov x8, #63
    svc #0
    mov x9, x0             // x9 = longitud de entrada

    // --- Comparar longitudes ---
    ldr x10, =clave_len
    mov x11, #clave_len    // longitud de la clave con '\n'

    cmp x9, x11
    b.ne incorrecta        // longitud distinta → incorrecta

    // --- Comparar carácter por carácter ---
    ldr x1, =user_input
    ldr x2, =clave_correcta
    mov x3, #0             // índice

comparar_loop:
    cmp x3, x11
    b.eq correcta

    ldrb w4, [x1, x3]
    ldrb w5, [x2, x3]
    cmp w4, w5
    b.ne incorrecta

    add x3, x3, #1
    b comparar_loop

// --- Contraseña correcta ---
correcta:
    ldr x0, =msg_ok
    mov x1, #len_ok
    bl print_msg
    b salir

// --- Contraseña incorrecta ---
incorrecta:
    ldr x0, =msg_fail
    mov x1, #len_fail
    bl print_msg

// --- Salir ---
salir:
    mov x8, #93
    mov x0, #0
    svc #0

// --- Función de impresión ---
print_msg:
    mov x2, x1     // longitud
    mov x1, x0     // puntero al mensaje
    mov x0, #1     // stdout
    mov x8, #64
    svc #0
    ret