Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 使用ASM THUMB将值写入GBA上的内存_Assembly_Arm_Gba - Fatal编程技术网

Assembly 使用ASM THUMB将值写入GBA上的内存

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

嘿,我正在做一个简单的大学项目,为GameBoy Advanced制作一个游戏

我一直在玩asm,打算通过asm和拇指模式创建我的调色板

我已经尝试使用
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