.text
.arm
.global _start
_start:
        b reset
        b loop
        b loop
        b loop
        b loop
        nop
        b loop
        b loop

/* ==============================
*  Programa principal
*  ==============================
*/
reset:  ldr sp,=STACK 
        ldr r1,TAMANIO
        ldr r2,=VECTOR
        ldr r3,=NUMEROS

otro:   ldr r0,[r2],#4        @ bucle que carga el puntero a la cadena 
        bl anumero            @ pasa cadena a numero 
        str r0,[r3],#4        @ guarda el resultado
        subs r1,#1
        bne otro
loop:   b loop

/* Funcion de pase a numero
*  Transforma una cadena en ascii a un numero.
*  Esta cadena posee las siguientes características:
*  *  El número en la cadena se encuentra en base 16
*  *  La cadena se supone que solo posee dígitos hexadecimales, donde las letras se encuentran en mayúsculas, puntos de
*  *  El único signo posible es un '-' y como primer byte, indicando que el número es negativo, si este signo no existe el número es positivo. 
*  Entrada
*  Dirección de la cadena en r0
*  Salida 
*  Numero resultante en r0
*/


anumero:
        push {r1-r6}
        mov r4,#0
        ldrb r1,[r0]            @ si el primer caracter es '-' se activa la bandera de signo a 1 (r4)
        cmp r1,#'-'   
        moveq r4,#1
        addeq r0,#1             @ si es negativo desplazo el puntero para no encontrar de nuevo el signo
        sub r5,r0,#1            @ calcular r5 para detectar comienzo de cadena 
anumero_otro:
        ldrb r1,[r0],#1         @ bucle para encontrar el final de cadena 
        cmp r1,#0
        bne anumero_otro
        sub r0,#2               
        mov r2,#1
        mov r3,#16 
        mov r6,#0 

anumero_otro2:
        ldrb r1,[r0],#-1        @ carga los elementos desde el menos significativo (último caracter)
        cmp r0,r5               @ compara si es comienzo de cadena para salir 
        blo anumero_fin
        cmp r1,#'.'
        beq anumero_cont
        cmp r1,#'9'             @ si es menos a '9' es un número si es mayor es una letra 
        subls r1,#'0'
        subhi r1,#('A'-10)
        mul r1,r2,r1            @ multiplico el dígito con el peso de la posición
        mul r2,r3,r2            @ recalculo el peso de la posición
        add r6,r1               @ acumulador con resultado
                                @ ejemplo 
                                @ entrada = '3','4','A'
                                @ calculo = (A *  1)+ (4 * 1 * 16) + (3 * 1 * 16 * 16)
anumero_cont:
        b anumero_otro2         
anumero_fin:
        mov r0,r6               
        cmp r4,#1               @ verifico signo para negar el número si fuera negativo 
        rsbeq r0,r0,#0   
        pop {r1-r6}    
        mov pc,lr
              

VECTOR: .word NUM1,NUM2
NUMEROS: .word 0,0
TAMANIO: .word 2 
NUM1: .asciz "0.A334"
NUM2: .asciz "-98"
.balign 4
      .space(200)
STACK:

        .end

