// ****************************************************************************
// * 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