Buenas tardes! Estoy desarrollando una que recorre una serie de listas para llegar a un valor concreto y almacenarlo en la variable 8007 (lo explico de manera escueta porque prefiero ser lo mas objetivo posible, si alguien le interesa saber para que es que lo diga y lo ponga en los comentarios sin ningun problema )
El problema es el siguiente:
Necesito que me devuelva un valor =<4 en la variable 8007, y para ello realizo una resta de -4 sobre el valor actual de un registro en forma de bucle. El fallo esta en que al realizar el comando cmp para comparar dicho valor, no lo compara y evidentemente sigue adelante con la siguiente orden de la rutina.
El valor que contiene R2 en el momento de realizar la comparacion es correcto (lo he comprobado, y en los casos de prueba era 31), pero no consigo que entre el bucle por la comparación.
Dejo aqui dicha rutina por si alguien me puede echar una mano:
De antemano muchas gracias a cualquiera que este leyendo esto por su atención, y mas a quien intente ayudarme de alguna forma jejeje
Un saludo!
PD: hay algunos nombres de variables (entiendase por var_8008, .facing_heroe, etc) que no se han utilizado todavia debido a que la rutina esta en fase de desarrollo. Tambien puede que haya algún comentario mal explicado o errado.
El problema es el siguiente:
Necesito que me devuelva un valor =<4 en la variable 8007, y para ello realizo una resta de -4 sobre el valor actual de un registro en forma de bucle. El fallo esta en que al realizar el comando cmp para comparar dicho valor, no lo compara y evidentemente sigue adelante con la siguiente orden de la rutina.
El valor que contiene R2 en el momento de realizar la comparacion es correcto (lo he comprobado, y en los casos de prueba era 31), pero no consigo que entre el bucle por la comparación.
Dejo aqui dicha rutina por si alguien me puede echar una mano:
Código:
.align 2
.thumb
Cargar_Banco:
push {lr}
ldr r0, .banco_actual @;Carga en r0 el offset del banco actual
ldrb r0, [r0] @;Almacena en r0 el primer byte (numero del banco actual)
mov r1, #0x4 @;Inserta el valor 0x4 en r1
mul r1, r0 @;Multiplica el valor de r0 por r1 y lo inserta en r1 para obtener el numero de entrada del banco
ldr r2, .cabezal_banco @;Carga Tabla de cabezales en r2
add r1, r2, r1 @;Añade desplazamiento sobre el offset cabezal_banco y lo sobrescribe en r1
Cargar_Mapa:
ldr r1, [r1] @; Carga el pointer correspondiente del Cabezal_Banco
ldr r0, .mapa_actual @;Carga en r0 el offset del mapa actual
ldrb r0, [r0] @;Almacena en r0 el primer byte (numero del mapa actual)
mov r2, #0x4 @;Inserta el valor 0x4 en r2
mul r2, r0 @;Multiplica el valor de r0 por r2 y lo inserta en r2 para obtener el numero de entrada del mapa
add r2, r1, r2 @;Añade desplazamiento sobre el offset banco y lo sobrescribe en r2
ldr r2, [r2] ;@Carga puntero del cabezal del mapa
ldr r2, [r2] @; Carga puntero de offset del mapa
Cargar_Info:
mov r1, #0xC @;Inserta el valor 0xC (12) en r1
add r1, r2, r1 @;Añade desplazamiento sobre el offset actual y lo sobrescribe en r1
ldr r1, [r1] @; Carga puntero del Data del mapa r1
@; INSERTAR AQUI LAS VARIABLES PARA POSICION DE GETPLAYERPOS()
mov r2, #0x1 @; Desplazamiento para cargar segundo byte de la halfword
add r2, r1, r2
ldr r2, [r2] @; Carga contenido del puntero en r2
@; HASTA AQUI FUNCIONA!
mov r1, #0x0 @; Contador
@; EL PROBLEMA ESTA AQUI!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! NO COMPARA LAS VARIABLES?
cmp r2, #0x4
bgt Bucle @;Si no va al bucle
b Estado @;Si es menor o igual a 3 sale del bucle
Bucle:
add r1, r1, #0x1 @; Sumar 1 al valor actual del contador
sub r2, r2, #0x4 @; Restar 1 al valor actual del valor de la variable a comparar
cmp r2, #0x4
bgt Bucle
b Estado
Estado:
ldr r3, .var_8007
strb r1, [r3] @;////// PONER R2 SI NO FUNCIONA
pop {pc}
.align 2
.var_8007: .word 0x20375E6
.var_8008: .word 0x20375E8
.var_8009: .word 0x20375EA
.cabezal_banco: .word 0x0886BBE4
.banco_actual: .word 0x03015E59
.mapa_actual: .word 0x03015E58
.facing_heroe: .word 0x0202065A
Un saludo!
PD: hay algunos nombres de variables (entiendase por var_8008, .facing_heroe, etc) que no se han utilizado todavia debido a que la rutina esta en fase de desarrollo. Tambien puede que haya algún comentario mal explicado o errado.
Última edición: