Assembly 使用ASM THUMB将值写入GBA上的内存
嘿,我正在做一个简单的大学项目,为GameBoy Advanced制作一个游戏 我一直在玩asm,打算通过asm和拇指模式创建我的调色板 我已经尝试使用Assembly 使用ASM THUMB将值写入GBA上的内存,assembly,arm,gba,Assembly,Arm,Gba,嘿,我正在做一个简单的大学项目,为GameBoy Advanced制作一个游戏 我一直在玩asm,打算通过asm和拇指模式创建我的调色板 我已经尝试使用ldr和str将内存地址0x0500000(调色板内存)加载到寄存器中,并存储一个值,例如0x253F(红色)并将其存储到调色板地址中。这怎么可能呢?我也尝试过使用MOV,但也没有成功 下面的代码可以编译,但似乎不起作用 .THUMB @ turn on thumb .ALIGN 2 @ align
ldr
和str
将内存地址0x0500000
(调色板内存)加载到寄存器中,并存储一个值,例如0x253F
(红色)并将其存储到调色板地址中。这怎么可能呢?我也尝试过使用MOV,但也没有成功
下面的代码可以编译,但似乎不起作用
.THUMB @ turn on thumb
.ALIGN 2 @ align code correctly for GBA
.GLOBL test @ name of function goes here
.THUMB_FUNC @ we are about to declare a thumb function
test: @ function start
push { r4-r7, lr } @ push r4-r7 and link register onto stack. Your function might use these
@ registers, so we need to preserve the values just in case!
@ we don't need to worry about r0-r3 as it is assumed they will be regularly messed up anyway
@ the magic happens here!
@ r0-r3 will automatically contain the parameters sent when calling the function.
ldr r5, =#0x5000000
ldr r4, =#0x03DF
str r5, [r4]
pop { r4-r7 } @ pop first 4 values from stack back into r4-r7, and also
pop { r3 } @ pop the next value from stack (stored value for lr) into some unused register, e.g. r3 -
@ we cannot overwrite lr so we have to do it via a normal register
bx r3 @ "branch and exchange" (return) back to C, using the previous value for lr stored in r3
@ ==================================
我真的非常感谢您的帮助什么是“似乎不起作用”的确切性质?数据中止?未定义指令?内存内容不变?因为您实际上不想存储整个32位值而导致损坏?有很多种可能,都是因为不同的原因。内存内容不变,这段代码什么都没做,有什么建议吗?在这里,你需要小心术语。仅通过编译代码不会发生任何事情。在你运行它之前,它不会做任何事情。无论如何,代码对我来说是可行的(我必须对如何调用Thumb函数做出某些假设,因为您还没有向我们展示)。您按下调色板查看器窗口上的刷新按钮了吗?您更新的代码将值
0x05000000
存储在地址0x03DF
中。还要注意的是,由于调色板条目是16位宽的,所以应该使用16位存储指令STRH。使用STR,您正在写入一个32位的值,这意味着您正在修改两个调色板条目。您不能返回pop{r4-r7,pc}
,而不是将lr
弹出到r3
然后运行bx r3
的笨拙的三指令序列吗?当然,此函数只需要两个scratch reg,因此您可以取出所有push/pop,并使用r0
和r1
而不是r4
和r5
。然后返回正常的bx-lr
。