GNU/Linux xterm-256color bash 136 views

// ****************************************************************************
// * Lenguajes de Interfaz en TECNM Campus ITT
// * Nombre del archivo: practica.s
// * Descripción: Programa que compara dos cadenas para saber si estas son iguales
// * Autor: [America Fernanda Nevarez de la Cruz]
// * Fecha: [2025-04-07]
// * Plataforma: Raspberry Pi OS (64 bits)
// * Demostración:  [https://asciinema.org/a/je6oe1KNqJPlKqpxF0z8m4lnM]
// ****************************************************************************

// ****************************************************************************
// * Codigo equivalente en JAVA
// * public class ComparadorCadenasManual {
// *
// *    public static void main(String[] args) {
// *        Scanner scanner = new Scanner(System.in);
// *        System.out.print("Ingrese la primera cadena: ");
// *        char[] cadena1 = scanner.nextLine().toCharArray();
// *        System.out.print("Ingrese la segunda cadena: ");
// *        char[] cadena2 = scanner.nextLine().toCharArray();
// *
// *        boolean iguales = true;
// *        // Primero comparar longitudes
// *        if (cadena1.length != cadena2.length) {
// *            iguales = false;
// *        } else {
// *            // Comparar carácter por carácter
// *            for (int i = 0; i < cadena1.length; i++) {
// *                if (cadena1[i] != cadena2[i]) {
// *                    iguales = false;
// *                    break;
// *                }
// *            }
// *        }    
// *        if (iguales) {
// *            System.out.println("Las cadenas son iguales");
// *        } else {
// *            System.out.println("Las cadenas son diferentes");
// *        }        
// *        scanner.close();
// *    }
// *}
// ****************************************************************************

.section .bss
buffer1: .skip 64
buffer2: .skip 64

.section .data
msg_ingrese1: .ascii "Ingrese la primera cadena: "
len_ingrese1 = . - msg_ingrese1

msg_ingrese2: .ascii "Ingrese la segunda cadena: "
len_ingrese2 = . - msg_ingrese2

msg_iguales: .ascii "Las cadenas son iguales\n"
len_iguales = . - msg_iguales

msg_diferentes: .ascii "Las cadenas son diferentes\n"
len_diferentes = . - msg_diferentes

.section .text
.global _start

_start:
    // --- Pedir y leer la primera cadena ---
    ldr x0, =msg_ingrese1
    mov x1, #len_ingrese1
    bl print_msg

    mov x0, #0
    ldr x1, =buffer1
    mov x2, #64
    mov x8, #63
    svc #0
    mov x9, x0           // x9 = longitud de la primera cadena

    // --- Pedir y leer la segunda cadena ---
    ldr x0, =msg_ingrese2
    mov x1, #len_ingrese2
    bl print_msg

    mov x0, #0
    ldr x1, =buffer2
    mov x2, #64
    mov x8, #63
    svc #0
    mov x10, x0          // x10 = longitud de la segunda cadena

    // --- Comparar longitudes primero ---
    cmp x9, x10
    b.ne cadenas_diferentes

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

comparar_loop:
    cmp x3, x9
    b.eq cadenas_iguales   // si terminamos de comparar sin diferencias

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

    add x3, x3, #1
    b comparar_loop

// --- Resultado: IGUALES ---
cadenas_iguales:
    ldr x0, =msg_iguales
    mov x1, #len_iguales
    bl print_msg
    b salir

// --- Resultado: DIFERENTES ---
cadenas_diferentes:
    ldr x0, =msg_diferentes
    mov x1, #len_diferentes
    bl print_msg
    b salir

// --- Salida del programa ---
salir:
    mov x8, #93
    mov x0, #0
    svc #0

// --- Función: imprimir mensaje ---
print_msg:
    mov x2, x1     // longitud
    mov x1, x0     // puntero
    mov x0, #1     // stdout
    mov x8, #64    // syscall write
    svc #0
    ret