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?

¿Fue útil?

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)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top