不能使用PUSH汇编程序指令

时间:2017-05-16 13:49:38

标签: assembly arm cortex-m3

我正在尝试编写一个能够在我的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)。

我做错了什么?

2 个答案:

答案 0 :(得分:2)

在ARM内联汇编中,寄存器R13,R14和R15 may not be accessed。如果要这样做,则必须在汇编中编写整个过程,而不是使用内联汇编。

答案 1 :(得分:0)

虽然PUSH指令不直接访问或修改R13,但间接修改它 - 这实际上保证会导致编译器生成的代码出现问题相同的功能。

如果这确实是编译器拒绝组装你自己完全合法的PUSH指令(当然,你自己冒险使用它)的原因,那么它发出的错误信息措辞不好。

不幸的是,ARMCC错误消息文档对此没有任何启示。

(正如其他人所指出的那样,无论如何你都不需要编写任何汇编程序,当然也不需要任何注册保存代码。)