代码之家  ›  专栏  ›  技术社区  ›  Federico klez Culloca

gba手臂装配程序的帮助

  •  4
  • Federico klez Culloca  · 技术社区  · 15 年前

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

    问题是,这个节目怎么了?

    2 回复  |  直到 15 年前
        1
  •  3
  •   Federico klez Culloca    15 年前

    我自己解决的。

    问题是我使用堆栈的方式。 而不是 stmdb ldmdb 我需要使用 stmfd ldmfd .

        2
  •  0
  •   old_timer    15 年前

    stmdb意味着在使用该地址开始向堆栈写入之前进行减量,这是正确的。ldmia意味着从当前堆栈指针开始递增,以将值读回其寄存器,然后递增堆栈指针。fd术语对我来说根本没有意义。就像jump if equal和jump if zero对于所有处理器都是相同的指令,并且一些asm同时提供这两种指令一样,ldm和stm只有两种类型db、ia和fd都映射到这两种类型中。我发现更容易记住后递增(ldmia)和前递减(ldmdb)。或者,如果由于某种原因将加载/存储方向转了一圈,则仍然可以根据尝试执行的操作选择正确的增量。

    在C语言中,它类似于*(ptr++)与*(++ptr)

    推荐文章