Question

J'ai essayé de modifier ce programme de montage ARM (voir en bas de la page) d'utiliser des sous-routines. Il devrait afficher un écran rouge sur la GBA (et la compilation du programme exemple, il ne fait, il est donc pas un problème d'utilisation de toolchain), mais, quand je le lance, l'écran devient noir au lieu. J'utilise 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 question est, ce qui ne va pas dans ce programme?

Était-ce utile?

La solution

Je l'ai résolu moi-même.

Le problème est la façon dont je la pile. Au lieu de stmdb et ldmdb je devais utiliser stmfd et ldmfd.

Autres conseils

moyens stmdb décrémenter avant et ensuite utiliser cette adresse pour commencer à écrire à la pile, c'est bon. des moyens de ldmia augmentation d'échelon après alors commencez avec le pointeur de la pile en cours pour lire les valeurs à leurs registres puis incrémenter le pointeur de la pile. la nomenclature fd n'a jamais fait sens pour moi. Comme sauter en cas d'égalité et sauter si zéro sont les mêmes instructions pour tous les processeurs et certains asms offrent à la fois, il n'y a que deux saveurs de LDM et le db sTM, entre autres, fd toute carte dans ces deux saveurs. Je trouve plus facile de se rappeler augmentation d'échelon après (ldmia) et avant décrémentation (ldmdb). Ou si vous tournez la direction de chargement / stockage mordit autour pour une raison quelconque, vous choisissez toujours l'incrément juste avant ou après en fonction de ce que vous essayez de faire.

En C, il est comme * (ptr ++) vs * (++ PTR)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top