Ayuda con el programa de montaje de GBA ARM
Pregunta
He intentado modificar este programa conjunto del brazo (véase la parte inferior de la página) utilizar subrutinas. Debe mostrar una pantalla de color rojo en el GBA (y compilar el programa de ejemplo que realmente hace, así que no es un problema de uso de herramientas principales), pero, cuando lo ejecuto, la pantalla se queda en negro en su lugar. Estoy usando devkitARM 30
.arm
.text
.global main
main:
mov r0, #0x4000000
mov r1, #0x400
add r1, r1, #3
str r1, [r0]
mov r0, #0x6000000
stmdb sp!, {r0, r2, lr} @push registers before calling
mov r0, #0xff
mov r1, #0
mov r2, #0
bl set_rgb
mov r1, r0
ldmdb sp!, {r0, r2, lr} @restore registers
mov r2, #0x9600
loop1:
strh r1, [r0], #2
subs r2, r2, #1
bne loop1
infin:
b infin
set_rgb:
@r0: R; r1: G; r2: B; r0: RGB
@truncate everything but the least significant five bits
and r0, r0, #0x1f
and r1, r1, #0x1f
and r2, r2, #0x1f
@form the color
orr r0, r0, r1, lsl #5
orr r0, r0, r2, lsl #10
mov pc, lr @return
La pregunta es, ¿qué hay de malo en este programa?
Solución
Lo resuelto por mi cuenta.
El problema era la forma en que utiliza la pila.
En lugar de stmdb
y ldmdb
que necesitaba usar stmfd
y ldmfd
.
Otros consejos
medios STMDb decrementan antes y después utilizar esa dirección para empezar a escribir a la pila, esto es correcto. medios ldmia Incrementar después así que empieza con el puntero de pila actual para leer los valores de vuelta a sus registros a continuación, incrementar el puntero de pila. la nomenclatura fd nunca tuvo sentido para mí. Al igual que salto si es igual a cero y saltar si son la misma instrucción para todos los procesadores y algunos ofrecen asms tanto, sólo hay dos sabores de LDM y STM el PP, entre otras cosas, fd toda mapa en esos dos sabores. Me resulta más fácil de recordar después de la subasta (ldmia) y decremento antes (ldmdb). O si a su vez la dirección de carga / almacenamiento mordió alrededor por alguna razón, entonces todavía elige el incremento justo antes o después dependiendo de lo que está tratando de hacer.
En C es como * (ptr ++) vs * (++ ptr)