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

/* ==============================
*  TEST CODE
*  ==============================
*/
reset:  ldr sp,=STACK 
        ldr r1,TAMANIO
        ldr r2,=VECTOR
        ldr r3,=NUMEROS

otro:   ldr r0,[r2],#4
        bl anumero
        str r0,[r3],#4
        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-r4}
        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      
        mov r2,#0
        mov r3,#16 
anumero_otro:
        ldrb r1,[r0],#1         @ carga los elementos desde el mas significativo (primer caracter

        cmp r1,#0
        beq 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 r2,r3               @ multiplico acumulador por 16
        add r2,r1               @ sumo al acumulador el digito
                                @ ejemplo 
                                @ entrada = '3','4','A'
                                @ calculo = ((0 * 16 + 3 ) * 16 + 4) * 16 + A 

anumero_cont:
        b anumero_otro         
anumero_fin:
        mov r0,r2
        cmp r4,#1               @ verifico signo para negar el número si fuera negativo 
        rsbeq r0,r0,#0   
        pop {r1-r4}    
        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

