我尝试修改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
问题是,这个程序有什么问题?
答案 0 :(得分:3)
我自己解决了。
问题在于我使用堆栈的方式。
我需要使用stmdb
和ldmdb
来代替stmfd
和ldmfd
。
答案 1 :(得分:0)
stmdb表示先减少然后使用该地址开始写入堆栈,这是正确的。 ldmia表示在使用当前堆栈指针启动后递增,以将值读回寄存器,然后递增堆栈指针。 fd命名法对我来说没有意义。就像跳跃如果相等而跳跃如果零是所有处理器的相同指令而一些asms提供两者,那么只有两种类型的ldm和stm db,ia,fd都映射到这两种风格。我发现更容易记住(ldmia)之后的增量和(ldmdb)之前的减量。或者,如果由于某种原因转动加载/存储方向位,那么根据您要执行的操作,您仍然可以在之前或之后选择正确的增量。
在C中它就像*(ptr ++)vs *(++ ptr)