Practica 24: Convierte en mayuscula la inicial de cada cadena - Roldan Castro Luis Alberto
by LuisRoldan
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