**
Nombre: hexa.s
Autor: Karla Itzel Vázquez Cruz
Fecha: 02-04-2025
Descripción: Convierte un número hexadecimal ingresado por teclado a decimal
Plataforma: Raspberry Pi OS 64-bit / ARM64
Asciinema: hexa.s
**
Versión en C:
#include <stdio.h>
#include <stdlib.h>
int main() {
char hex[20];
printf("Ingresa un número hexadecimal: ");
scanf("%s", hex);
int num = (int)strtol(hex, NULL, 16);
printf("Decimal: %d\n", num);
return 0;
}
Versión en ARM64 RaspbianOS Linux:
.global _start
.section .bss
input_buffer: .skip 32
dec_buffer: .skip 12
.section .data
prompt: .asciz "Ingresa un número hexadecimal: "
newline: .asciz "\n"
.section .text
_start:
// Imprimir mensaje
ldr x0, =1 // stdout
ldr x1, =prompt
bl strlen
mov x2, x0
mov x0, #1
ldr x1, =prompt
mov x8, #64 // syscall write
svc 0
// Leer entrada del usuario
mov x0, #0 // stdin
ldr x1, =input_buffer
mov x2, #31
mov x8, #63 // syscall read
svc 0
// Convertir string hexadecimal a entero
ldr x0, =input_buffer
bl hex_to_uint // resultado en w0
// Convertir a decimal string
ldr x1, =dec_buffer
mov x2, #10
bl uint_to_str
// Imprimir número en decimal
ldr x1, =dec_buffer
bl strlen
mov x2, x0
mov x0, #1
ldr x1, =dec_buffer
mov x8, #64
svc 0
// Salto de línea
mov x2, #1
ldr x1, =newline
mov x0, #1
mov x8, #64
svc 0
// Salir
mov x8, #93
mov x0, #0
svc 0
// ---------------------------
// hex_to_uint
// Entrada: x0 = dirección del string
// Salida: w0 = valor decimal (unsigned)
// ---------------------------
hex_to_uint:
mov w1, #0 // acumulador
.hex_loop:
ldrb w2, [x0], #1
cmp w2, #'0'
blt .done
cmp w2, #'9'
ble .digit_09
cmp w2, #'A'
blt .done
cmp w2, #'F'
ble .digit_AF
cmp w2, #'a'
blt .done
cmp w2, #'f'
ble .digit_af
b .done
.digit_09:
sub w2, w2, #'0'
b .accumulate
.digit_AF:
sub w2, w2, #'A'
add w2, w2, #10
b .accumulate
.digit_af:
sub w2, w2, #'a'
add w2, w2, #10
b .accumulate
.accumulate:
lsl w1, w1, #4
orr w1, w1, w2
b .hex_loop
.done:
mov w0, w1
ret
// ---------------------------
// uint_to_str (base 10)
// Entrada: w0 = número, x1 = buffer, x2 = base
// Salida: string null-terminated en x1
// ---------------------------
uint_to_str:
stp x3, x4, [sp, #-16]!
mov x3, x1
mov x4, #0
.u2s_loop:
udiv w5, w0, w2
msub w6, w5, w2, w0
add w6, w6, #'0'
strb w6, [x1], #1
mov w0, w5
cbz w0, .u2s_done
b .u2s_loop
.u2s_done:
mov w6, #0
strb w6, [x1]
sub x1, x1, #1
mov x2, x3
.rev_loop:
cmp x2, x1
bge .rev_done
ldrb w4, [x2]
ldrb w5, [x1]
strb w5, [x2]
strb w4, [x1]
add x2, x2, #1
sub x1, x1, #1
b .rev_loop
.rev_done:
ldp x3, x4, [sp], #16
ret
// ---------------------------
// strlen
// Entrada: x1 = puntero
// Salida: x0 = longitud
// ---------------------------
strlen:
mov x0, x1
.str_loop:
ldrb w2, [x1]
cbz w2, .str_end
add x1, x1, #1
b .str_loop
.str_end:
sub x0, x1, x0
ret