GNU/Linux xterm-256color bash 165 views

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

More recordings by Itzel

Browse all

SUMA DE 3 NUMEROS 0:59

by Itzel

CONTADOR PRIMOS 1:17

by Itzel

MULTIPLICAION 3:24

by Itzel

FAHRENHEIT A CELSIUS 1:26

by Itzel