GNU/Linux xterm-256color bash 136 views

/*
Autor: Victor Manuel Madrid Lugo
Fecha: 08/04/2025
Descripción: Convierte una letra minúscula a mayúscula ingresada por el usuario
Demostración: https://asciinema.org/a/VkTJQu4cVLU4VhrXbfsZr56SM
*/

/*Equivalente en C
#include <stdio.h>

int main() {
    char letra;
    
    printf("Ingrese una letra minúscula: ");
    scanf("%c", &letra);
    
    if (letra >= 'a' && letra <= 'z') {
        char mayuscula = letra - 32;
        printf("La letra en mayúscula es: %c\n", mayuscula);
    } else {
        printf("Error: No ingresó una letra minúscula válida (a-z)\n");
    }
    
    return 0;
}
*/

.section .data
    msg_prompt:   .asciz "Ingrese una letra minúscula: "
    msg_result:   .asciz "La letra en mayúscula es: "
    msg_error:    .asciz "Error: No ingresó una letra minúscula válida (a-z)\n"
    newline:      .asciz "\n"
    buffer:       .skip 2       // Buffer para un solo carácter + newline

.section .text
.global _start

_start:
    // Mostrar mensaje para ingresar letra
    mov x0, #1                  // stdout
    ldr x1, =msg_prompt
    mov x2, #29                 // Longitud del mensaje
    mov x8, #64                 // syscall write
    svc #0

    // Leer entrada del usuario
    mov x0, #0                  // stdin
    ldr x1, =buffer
    mov x2, #2                  // Leer 1 carácter + newline
    mov x8, #63                 // syscall read
    svc #0

    // Verificar si es una letra minúscula (a-z)
    ldrb w19, [x1]              // Cargar el carácter ingresado
    cmp w19, #'a'
    b.lt error
    cmp w19, #'z'
    b.gt error

    // Convertir a mayúscula (restar 32 en ASCII)
    sub w20, w19, #32           // w20 = w19 - 32

    // Mostrar resultado
    mov x0, #1
    ldr x1, =msg_result
    mov x2, #26                 // Longitud del mensaje resultado
    mov x8, #64
    svc #0

    // Imprimir la letra convertida
    strb w20, [x1]              // Almacenar en buffer
    mov x0, #1
    mov x2, #1                  // Longitud 1 carácter
    mov x8, #64
    svc #0

    // Imprimir nueva línea
    mov x0, #1
    ldr x1, =newline
    mov x2, #1
    mov x8, #64
    svc #0

    // Salir
    b exit

error:
    // Mostrar mensaje de error
    mov x0, #1
    ldr x1, =msg_error
    mov x2, #47                 // Longitud del mensaje error
    mov x8, #64
    svc #0

exit:
    // Terminar programa
    mov x0, #0                  // Código de retorno
    mov x8, #93                 // syscall exit
    svc #0