GNU/Linux xterm-256color bash 197 views

// ****************************************************************************
// * Nombre del archivo: practica.s
// * Descripción: Programa que comprueba si un programa tiene los mismos digitos
// * Autor: Roldan Castro Luis Alberto
// * Fecha: 10-04-2025
// * Plataforma: Raspberry Pi OS (64 bits)
// * Asciinema: https://asciinema.org/a/coR27O9ctXBDa4XvJ48IuMC8e
// ****************************************************************************

// ****************************************************************************
// Version en python
//
//def mismos_digitos(numero):
//    numero_str = str(numero)  # Convertimos el número a cadena
//    return all(d == numero_str[0] for d in numero_str)  # Verificamos si todos los dígitos son iguales
//
//# Entrada del usuario
//numero = input("Ingrese un número: ")
//
//# Comprobamos y mostramos el resultado
//if mismos_digitos(numero):
//    print("Todos los dígitos son iguales.")
//else:
//    print("Los dígitos no son iguales.")
// ****************************************************************************

.section .bss
buffer1: .skip 64
buffer2: .skip 64
count1:  .skip 10     // conteo de dígitos para el primer número
count2:  .skip 10     // conteo de dígitos para el segundo número

.section .data
msg_ingrese1: .ascii "Ingrese el primer numero: "
len_ingrese1 = . - msg_ingrese1

msg_ingrese2: .ascii "Ingrese el segundo numero: "
len_ingrese2 = . - msg_ingrese2

msg_iguales: .ascii "Tienen los mismos digitos\n"
len_iguales = . - msg_iguales

msg_diferentes: .ascii "NO tienen los mismos digitos\n"
len_diferentes = . - msg_diferentes

.section .text
.global _start

_start:
    // --- Leer primer número ---
    adr x0, msg_ingrese1
    mov x1, #len_ingrese1
    bl print_msg

    mov x0, #0
    adr x1, buffer1
    mov x2, #64
    mov x8, #63
    svc #0
    mov x9, x0          // longitud

    // --- Leer segundo número ---
    adr x0, msg_ingrese2
    mov x1, #len_ingrese2
    bl print_msg

    mov x0, #0
    adr x1, buffer2
    mov x2, #64
    mov x8, #63
    svc #0
    mov x10, x0         // longitud

    // --- Limpiar conteos ---
    mov x3, #0
    adr x4, count1
    adr x5, count2
clear_loop:
    strb wzr, [x4, x3]
    strb wzr, [x5, x3]
    add x3, x3, #1
    cmp x3, #10
    blt clear_loop

    // --- Contar dígitos en buffer1 ---
    mov x3, #0
    adr x1, buffer1
count1_loop:
    cmp x3, x9
    b.ge count2_start

    ldrb w4, [x1, x3]
    cmp w4, #'0'
    blt count1_next
    cmp w4, #'9'
    bgt count1_next
    sub w4, w4, #'0'
    adr x5, count1
    ldrb w6, [x5, x4]
    add w6, w6, #1
    strb w6, [x5, x4]
count1_next:
    add x3, x3, #1
    b count1_loop

// --- Contar dígitos en buffer2 ---
count2_start:
    mov x3, #0
    adr x1, buffer2
count2_loop:
    cmp x3, x10
    b.ge comparar_conteos

    ldrb w4, [x1, x3]
    cmp w4, #'0'
    blt count2_next
    cmp w4, #'9'
    bgt count2_next
    sub w4, w4, #'0'
    adr x5, count2
    ldrb w6, [x5, x4]
    add w6, w6, #1
    strb w6, [x5, x4]
count2_next:
    add x3, x3, #1
    b count2_loop

// --- Comparar conteos ---
comparar_conteos:
    mov x3, #0
    adr x4, count1
    adr x5, count2
cmp_loop:
    ldrb w6, [x4, x3]
    ldrb w7, [x5, x3]
    cmp w6, w7
    b.ne diferentes
    add x3, x3, #1
    cmp x3, #10
    blt cmp_loop

    // Son iguales
    adr x0, msg_iguales
    mov x1, #len_iguales
    bl print_msg
    b salir

diferentes:
    adr x0, msg_diferentes
    mov x1, #len_diferentes
    bl print_msg
    b salir

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

// --- Función print_msg(x0 = ptr, x1 = len) ---
print_msg:
    mov x2, x1
    mov x1, x0
    mov x0, #1
    mov x8, #64
    svc #0
    ret