/*
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