我正在尝试编写一个函数,它将在我的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中的值。我试着把它们推到堆栈上,然后弹出回来,但当我添加
PUSH {R0, R1}
型
在函数的开头,我得到一个错误:
1161:无法直接修改堆栈指针SP(r13)。
我做错了什么?
2条答案
按热度按时间2nbm6dog1#
虽然
PUSH
指令不直接访问或修改R13
,但它确实间接地修改了R13
-这几乎肯定会导致同一函数中编译器生成的代码出现问题。如果这确实是编译器拒绝汇编您的-本身完全合法的-
PUSH
指令的原因(当然,您使用该指令时要自担风险),那么它发出的错误消息措辞不当。不幸的是,ARMCC错误消息文档没有说明这一点。
(As其他人指出,你不需要写任何汇编程序,当然也不需要写任何寄存器保存代码。)
6psbrbz92#
在ARM内联汇编中,寄存器R13、R14和R15 may not be accessed。如果你想这样做,你必须在汇编中编写整个过程,而不是使用内联汇编。