Domanda

Ho cercato di modificare questo programma assembly ARM (vedere fondo pagina) per usare le subroutine. Dovrebbe visualizzare una schermata rossa sul GBA (e la compilazione del programma di esempio che in realtà lo fa, quindi non è un problema uso toolchain), ma, quando l'eseguo, lo schermo diventa nero, invece. Sto 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 domanda è, cosa c'è di sbagliato in questo programma?

È stato utile?

Soluzione

ho risolto da solo.

Il problema era il modo in cui ho usato la pila. Invece di stmdb e ldmdb avevo bisogno di usare stmfd e ldmfd.

Altri suggerimenti

mezzi stmdb decrementare prima e quindi utilizzare tale indirizzo per iniziare a scrivere allo stack, questo è corretto. mezzi ldmia incremento dopo così iniziano con il puntatore stack corrente per leggere i valori ai registri quindi incrementare lo stack pointer. la nomenclatura fd non aveva senso per me. Come saltare se uguale e saltare se lo zero sono la stessa istruzione per tutti i processori e alcuni ASMS offrono entrambi, ci sono solo due sapori della LDM e STM il db, ia, fd tutti mappa in quei due sapori. Trovo più facile da ricordare di incremento dopo (ldmia) e decremento prima (ldmdb). Oppure, se si accende la direzione del carico / store po 'in giro per qualche motivo, allora si sceglie ancora l'incremento subito prima o dopo a seconda di ciò che si sta cercando di fare.

In C è come * (ptr ++) vs * (++ PTR)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top