GNU/Linux xterm-256color bash 135 views

// ****************************************************************************
// * Nombre del archivo: practica.s
// * Descripción: Convierte en mayuscula la inicial de cada cadena
// * Autor: Roldan Castro Luis Alberto
// * Fecha: 07-04-2025
// * Plataforma: Raspberry Pi OS (64 bits)
// * Asciinema: https://asciinema.org/a/kFPxh61Wzi90YStUK3jWnAMDM
// ****************************************************************************

// ****************************************************************************
//
//Version equivalente en Swift
//
//import Foundation
//
// Función que solicita al usuario una cadena, la convierte de minúsculas a mayúsculas y la imprime
//func convertirAMayusculas() {
//    // Solicitar la entrada del usuario
//    print("Ingresa una cadena: ", terminator: "")
//    
//    // Leer la cadena ingresada por el usuario
//    guard let input = readLine() else {
//        print("Error al leer la entrada.")
//        return
//    }
//    
//    // Convertir la cadena a mayúsculas
//    let converted = input.map { char -> Character in
//        if let scalar = char.asciiValue, scalar >= 97 && scalar <= 122 {
//            // Si el carácter es minúscula (entre 'a' y 'z'), convertirlo a mayúscula
//            return Character(Unicode.Scalar(scalar - 32)!)
//        } else {
//            // Si no es minúscula, dejarlo tal como está
//            return char
//        }
//    }
//    
//    // Convertir el array de caracteres de nuevo a string
//    let resultString = String(converted)
//    
//    // Imprimir la cadena modificada
//    print(resultString)
//}
//
// Llamamos a la función
//convertirAMayusculas()
// ****************************************************************************

.section .data
prompt:     .asciz "Ingresa una cadena: "  // Mensaje que solicita la entrada del usuario
prompt_len: .word 20                      // Longitud del mensaje de solicitud
newline:    .asciz "\n"                   // Salto de línea para imprimir después
newline_len: .word 1                      // Longitud del salto de línea (1 byte)

.section .bss
input:      .space 100                    // Reservamos 100 bytes para almacenar la cadena de entrada

.section .text
.global _start

_start:
    // Imprimir el mensaje de solicitud
    mov x0, 1              // Establecemos el descriptor de archivo a STDOUT (salida estándar)
    ldr x1, =prompt        // Cargamos la dirección del mensaje de solicitud en x1
    ldr x2, =prompt_len    // Cargamos la dirección de la longitud del mensaje
    ldr w2, [x2]           // Cargamos la longitud del mensaje en w2
    mov x8, 64             // sys_write (número de llamada al sistema para escribir)
    svc 0                  // Realizamos la llamada al sistema para escribir el mensaje

    // Leer la cadena ingresada
    mov x0, 0              // Establecemos el descriptor de archivo a STDIN (entrada estándar)
    ldr x1, =input         // Cargamos la dirección donde almacenar la cadena de entrada
    mov x2, 100            // Establecemos el número máximo de bytes a leer (100)
    mov x8, 63             // sys_read (número de llamada al sistema para leer)
    svc 0                  // Realizamos la llamada al sistema para leer la entrada del usuario

    // Procesar la cadena
    mov x10, x0            // Guardamos la longitud de la cadena leída en x10
    mov x11, 0             // Inicializamos el índice de la cadena en 0
    ldr x12, =input        // Cargamos la dirección de la cadena de entrada en x12
    mov w13, #' '          // Establecemos el valor de espacio para detectar palabras

    mov w14, #' '          // Inicialmente consideramos que antes hubo un espacio

process_loop:
    cmp x11, x10           // Comparamos el índice con la longitud de la cadena
    b.ge done              // Si el índice alcanza la longitud, salimos del loop

    ldrb w1, [x12, x11]    // Cargamos el siguiente byte de la cadena en w1

    // Verificar si es letra minúscula
    cmp w14, #' '          // Si antes hubo un espacio, buscar convertir
    b.ne skip_convert      // Si no fue un espacio, no convertir

    cmp w1, #'a'           // Comprobamos si el carácter es mayor o igual a 'a'
    blt skip_convert       // Si es menor que 'a', no hacer nada
    cmp w1, #'z'           // Comprobamos si el carácter es menor o igual a 'z'
    b.gt skip_convert      // Si es mayor que 'z', no hacer nada

    // Convertir a mayúscula (restar 32)
    sub w1, w1, #32        // Restamos 32 al valor del carácter para convertirlo a mayúscula
    strb w1, [x12, x11]    // Guardamos el carácter convertido de nuevo en la cadena
    b next_char            // Saltamos al siguiente carácter

skip_convert:
    strb w1, [x12, x11]    // Si no es necesario convertir, simplemente guardamos el carácter tal como está

next_char:
    mov w14, w1            // Guardamos el carácter actual para compararlo en la siguiente iteración
    add x11, x11, #1       // Incrementamos el índice para procesar el siguiente carácter
    b process_loop         // Volvemos a comenzar el loop para procesar el siguiente carácter

done:
    // Imprimir la cadena modificada
    mov x0, 1              // Establecemos el descriptor de archivo a STDOUT
    ldr x1, =input         // Cargamos la dirección de la cadena modificada
    mov x2, x10            // Cargamos la longitud de la cadena
    mov x8, 64             // sys_write (número de llamada al sistema para escribir)
    svc 0                  // Realizamos la llamada al sistema para imprimir la cadena modificada

    // Imprimir salto de línea
    mov x0, 1              // Establecemos el descriptor de archivo a STDOUT
    ldr x1, =newline       // Cargamos la dirección del salto de línea
    ldr x2, =newline_len   // Cargamos la longitud del salto de línea
    ldr w2, [x2]           // Cargamos la longitud del salto de línea en w2
    mov x8, 64             // sys_write (número de llamada al sistema para escribir)
    svc 0                  // Realizamos la llamada al sistema para imprimir el salto de línea

    // Salir
    mov x8, 93             // sys_exit (número de llamada al sistema para salir)
    mov x0, 0              // Establecemos el código de salida en 0
    svc 0                  // Llamada al sistema para salir del programa