【问题标题】:Help with GBA ARM assembly programGBA ARM 汇编程序的帮助
【发布时间】:2010-04-26 10:15:53
【问题描述】:

我尝试修改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

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

【问题讨论】:

    标签: assembly arm devkitpro game-boy-advance


    【解决方案1】:

    我自己解决了。

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

    【讨论】:

    • 就可以了。你明白为什么这不起作用,对吧?
    • 我认为是的,因为堆栈指针在推送和弹出时都在下降。是这样吗?
    • 完全正确。请注意,stmfdstmdb 相同,ldmfdldmia 相同。我个人觉得这样想他们更容易。
    【解决方案2】:

    stmdb 表示之前递减,然后用那个地址开始写入堆栈,这是正确的。

    ldmia 表示之后递增,因此从当前堆栈指针开始,将值读回其寄存器,然后递增堆栈指针。

    fd 命名法对我来说从来没有意义。就像对于所有处理器来说,如果相等则跳转和如果为零则跳转是相同的指令,并且一些 asms 提供这两种指令,只有ldmstm 的两种风格 db,ia,fd 都映射到那些两种口味。

    我发现更容易记住 (ldmia) 之后的增量和 (ldmdb) 之前的减量。或者,如果您出于某种原因改变了加载/存储方向,那么您仍然可以根据您要执行的操作在之前或之后选择正确的增量。

    在 C 中就像 *(ptr++)*(++ptr)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-25
      • 2011-10-14
      • 1970-01-01
      • 2014-06-25
      • 1970-01-01
      • 2014-04-15
      相关资源
      最近更新 更多