我正在尝试编写一个能够在我的Cortex M3平台上重置GPIO0的函数。我正在使用Keil编译器。 目标是将“1”写入地址0x40041014。我写了一段代码:
static void resetGPIO0()
{
__asm
{
MOV R0, #0x01
MOV R1, #0x1000
MOVT R1, #0x4004
STR R0, [R1, #0x14]
}
}
并且它正在工作,但我遇到的问题是我的函数会覆盖之前在R0和R1中的值。我试图将它们推到堆叠然后再回到POP,但是当我添加
时PUSH {R0, R1}
到函数的开头我得到一个错误:
1161:无法直接修改堆栈指针SP(r13)。
我做错了什么?
答案 0 :(得分:2)
在ARM内联汇编中,寄存器R13,R14和R15 may not be accessed。如果要这样做,则必须在汇编中编写整个过程,而不是使用内联汇编。
答案 1 :(得分:0)
虽然PUSH
指令不直接访问或修改R13
,但间接修改它 - 这实际上保证会导致编译器生成的代码出现问题相同的功能。
如果这确实是编译器拒绝组装你自己完全合法的PUSH
指令(当然,你自己冒险使用它)的原因,那么它发出的错误信息措辞不好。
不幸的是,ARMCC错误消息文档对此没有任何启示。
(正如其他人所指出的那样,无论如何你都不需要编写任何汇编程序,当然也不需要任何注册保存代码。)