assembly 无法使用PUSH汇编程序指令

qyyhg6bp  于 2023-08-06  发布在  其他
关注(0)|答案(2)|浏览(134)

我正在尝试编写一个函数,它将在我的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)。
我做错了什么?

2nbm6dog

2nbm6dog1#

虽然PUSH指令不直接访问或修改R13,但它确实间接地修改了R13-这几乎肯定会导致同一函数中编译器生成的代码出现问题。
如果这确实是编译器拒绝汇编您的-本身完全合法的-PUSH指令的原因(当然,您使用该指令时要自担风险),那么它发出的错误消息措辞不当。
不幸的是,ARMCC错误消息文档没有说明这一点。
(As其他人指出,你不需要写任何汇编程序,当然也不需要写任何寄存器保存代码。)

6psbrbz9

6psbrbz92#

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

相关问题