GNU/Linux xterm-256color bash 174 views

/*
Autor: Victor Manuel Madrid Lugo
Fecha: 08/04/2025
Descripción: Lee un carácter y muestra su código ASCII
Demostración: [https://asciinema.org/a/IVq4MnajGjLAQs6bzEdbnLEFy
]

Equivalente en C++:
#include <iostream>
using namespace std;

int main() {
    char c;
    cout << "Ingrese un carácter: ";
    cin >> c;
    cout << "Código ASCII: " << (int)c << endl;
    return 0;
}
*/

.section .data
    msg_prompt:    .asciz "Ingrese un carácter: "
    msg_result:    .asciz "Código ASCII: "
    newline:       .asciz "\n"
    buffer:        .skip 4        // Buffer ampliado para conversión
    ascii_buffer:  .skip 2        // Buffer para el carácter leído

.section .text
.global _start

_start:
    // Mostrar mensaje
    mov x0, #1
    ldr x1, =msg_prompt
    mov x2, #21          // Longitud del mensaje
    mov x8, #64          // syscall write
    svc #0

    // Leer carácter
    mov x0, #0
    ldr x1, =ascii_buffer
    mov x2, #2           // Leer 1 carácter + newline
    mov x8, #63          // syscall read
    svc #0

    // Obtener código ASCII
    ldrb w19, [x1]       // Cargar el carácter

    // Convertir a string decimal
    ldr x0, =buffer
    mov x1, x19
    bl int_to_str        // Usaremos una función mejorada

    // Mostrar resultado
    mov x0, #1
    ldr x1, =msg_result
    mov x2, #14          // Longitud de msg_result
    mov x8, #64
    svc #0

    mov x0, #1
    ldr x1, =buffer
    bl strlen            // Calcular longitud del número
    mov x2, x0           // Usar longitud calculada
    mov x8, #64
    svc #0

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

    // Salir
    mov x0, #0
    mov x8, #93
    svc #0

// Función mejorada int_to_str
int_to_str:
    mov x2, #10
    mov x3, #0           // Contador dígitos
    mov x4, x0           // Guardar dirección buffer

    // Manejar 0
    cbz x1, handle_zero

    // Convertir dígitos
convert_loop:
    udiv x5, x1, x2      // x5 = x1 / 10
    msub x6, x5, x2, x1  // x6 = x1 % 10
    add x6, x6, #'0'
    strb w6, [x4, x3]
    add x3, x3, #1
    mov x1, x5
    cbnz x1, convert_loop

    // Invertir dígitos
    mov x5, #0           // inicio
    sub x6, x3, #1       // fin
reverse_loop:
    cmp x5, x6
    b.ge done
    ldrb w7, [x4, x5]
    ldrb w8, [x4, x6]
    strb w8, [x4, x5]
    strb w7, [x4, x6]
    add x5, x5, #1
    sub x6, x6, #1
    b reverse_loop

handle_zero:
    mov w5, #'0'
    strb w5, [x4]
    mov x3, #1

done:
    // Null terminator
    mov x5, #0
    strb w5, [x4, x3]
    ret

// Función strlen
strlen:
    mov x2, #0
strlen_loop:
    ldrb w3, [x1, x2]
    cbz w3, strlen_end
    add x2, x2, #1
    b strlen_loop
strlen_end:
    mov x0, x2
    ret