assembly - GBA ARM汇编程序帮助

标签 assembly arm devkitpro game-boy-advance

我试图修改 this ARM 汇编程序(见页面底部)使用子程序。
它应该在 GBA 上显示一个红色屏幕(并编译它实际执行的示例程序,因此这不是工具链使用问题),但是,当我运行它时,屏幕反而变黑了。我正在使用 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

问题是,这个程序有什么问题?

最佳答案

我自己解决了。

问题是我使用堆栈的方式。
而不是 stmdbldmdb我需要使用 stmfdldmfd .

关于assembly - GBA ARM汇编程序帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2712593/

相关文章:

assembly - 从另一个文件调用过程

c - Strsep 在我的 Mac OS X x86_64 系统上返回 32 位指针

assembly - 我不明白如何使用Interrupt 21,AH = 0ah

c - NDS自制程序: Multiple Animation Speeds for Sprites

assembly - MIPS32 和 MIPS64 指令

linux - 了解 U-Boot 进程的 Linux 加载地址

c++ - IAR EW for ARM 分析器

assembly - ARMv8 高级 SIMD : "invalid addressing mode at operand 2 -- ` st1 {V1. D}[0],[x20,640 ]'"

bash - 在 VSCode 终端中运行 msys2 shell

c - 我如何在 devkitPro 上播放音频?