GNU/Linux xterm-256color bash 188 views

// ****************************************************************************
// * Nombre del archivo: practica.s
// * Descripción: Compara si dos cadenas son iguales
// * Autor: Roldan Castro Luis Alberto
// * Fecha: 10-04-2025
// * Plataforma: Raspberry Pi OS (64 bits)
// * Asciinema: https://asciinema.org/a/aK9OoKalkCVRWGKmddnGPDM0m
// ****************************************************************************

// ****************************************************************************
// Version en SWIFT
//
//import Foundation
//
// Solicitar la primera cadena
//print("Ingrese la primera cadena:")
//let cadena1 = readLine() ?? ""
//
// Solicitar la segunda cadena
//print("Ingrese la segunda cadena:")
//let cadena2 = readLine() ?? ""
//
// Comparar las cadenas
//if cadena1 == cadena2 {
//    print("Las cadenas son iguales.")
//} else {
//    print("Las cadenas son diferentes.")
//}
//
// ****************************************************************************

.section .bss
cadena1: .skip 64   // Reservamos 64 bytes para la primera cadena de caracteres
cadena2: .skip 64   // Reservamos 64 bytes para la segunda cadena de caracteres

.section .data
mensaje_pedir_cadena1: .ascii "Ingrese la primera cadena: "  // Mensaje que solicita la primera cadena
longitud_mensaje1 = . - mensaje_pedir_cadena1   // Longitud del mensaje de la primera cadena

mensaje_pedir_cadena2: .ascii "Ingrese la segunda cadena: "  // Mensaje que solicita la segunda cadena
longitud_mensaje2 = . - mensaje_pedir_cadena2   // Longitud del mensaje de la segunda cadena

mensaje_cadenas_iguales: .ascii "Las cadenas son iguales\n"  // Mensaje cuando las cadenas son iguales
longitud_cadenas_iguales = . - mensaje_cadenas_iguales

mensaje_cadenas_diferentes: .ascii "Las cadenas son diferentes\n"  // Mensaje cuando las cadenas son diferentes
longitud_cadenas_diferentes = . - mensaje_cadenas_diferentes

.section .text
.global _start

_start:
    // --- Pedir y leer la primera cadena ---
    ldr x0, =mensaje_pedir_cadena1  // Cargar mensaje de solicitud para la primera cadena
    mov x1, #longitud_mensaje1     // Longitud del mensaje
    bl imprimir_mensaje            // Llamar a la función para imprimir el mensaje

    // Leer la primera cadena de caracteres
    mov x0, #0                     // Descriptor de archivo 0 (entrada estándar)
    ldr x1, =cadena1                // Dirección donde se almacenará la primera cadena
    mov x2, #64                    // Máximo número de caracteres a leer
    mov x8, #63                    // Syscall para leer
    svc #0                          // Hacer la syscall
    mov x9, x0                     // x9 = longitud de la primera cadena leída

    // --- Pedir y leer la segunda cadena ---
    ldr x0, =mensaje_pedir_cadena2  // Cargar mensaje de solicitud para la segunda cadena
    mov x1, #longitud_mensaje2     // Longitud del mensaje
    bl imprimir_mensaje            // Llamar a la función para imprimir el mensaje

    // Leer la segunda cadena de caracteres
    mov x0, #0                     // Descriptor de archivo 0 (entrada estándar)
    ldr x1, =cadena2                // Dirección donde se almacenará la segunda cadena
    mov x2, #64                    // Máximo número de caracteres a leer
    mov x8, #63                    // Syscall para leer
    svc #0                          // Hacer la syscall
    mov x10, x0                    // x10 = longitud de la segunda cadena leída

    // --- Comparar longitudes de las cadenas primero ---
    cmp x9, x10                    // Comparar longitudes de las cadenas
    b.ne cadenas_diferentes         // Si no son iguales, saltar a cadenas_diferentes

    // --- Comparar cada carácter de ambas cadenas ---
    mov x3, #0                     // Inicializar índice a 0
    ldr x1, =cadena1                // Dirección de la primera cadena
    ldr x2, =cadena2                // Dirección de la segunda cadena

comparar_loop:
    cmp x3, x9                     // Comparar índice con la longitud de la cadena
    b.eq cadenas_iguales           // Si hemos comparado todos los caracteres, las cadenas son iguales

    ldrb w4, [x1, x3]              // Cargar el carácter de la primera cadena
    ldrb w5, [x2, x3]              // Cargar el carácter de la segunda cadena
    cmp w4, w5                     // Comparar los caracteres
    b.ne cadenas_diferentes         // Si son diferentes, saltar a cadenas_diferentes

    add x3, x3, #1                 // Incrementar el índice
    b comparar_loop                // Repetir el ciclo

// --- Resultado: Cadenas IGUALES ---
cadenas_iguales:
    ldr x0, =mensaje_cadenas_iguales   // Cargar el mensaje de "cadenas iguales"
    mov x1, #longitud_cadenas_iguales // Longitud del mensaje
    bl imprimir_mensaje               // Imprimir el mensaje
    b salir                          // Saltar al final

// --- Resultado: Cadenas DIFERENTES ---
cadenas_diferentes:
    ldr x0, =mensaje_cadenas_diferentes   // Cargar el mensaje de "cadenas diferentes"
    mov x1, #longitud_cadenas_diferentes // Longitud del mensaje
    bl imprimir_mensaje                  // Imprimir el mensaje
    b salir                             // Saltar al final

// --- Salir del programa ---
salir:
    mov x8, #93    // Syscall para salir del programa
    mov x0, #0     // Código de salida 0 (éxito)
    svc #0         // Llamar a la syscall

// --- Función: imprimir mensaje ---
imprimir_mensaje:
    mov x2, x1        // Longitud del mensaje
    mov x1, x0        // Dirección del mensaje
    mov x0, #1        // Descriptor de archivo 1 (salida estándar)
    mov x8, #64       // Syscall para escribir
    svc #0            // Hacer la syscall
    ret               // Retornar de la función