【问题标题】:Saving value of stack pointer in C variable in Code Composer studio for ARM cortex M4f在 Code Composer Studio 中为 ARM cortex M4f 保存 C 变量中的堆栈指针值
【发布时间】:2015-10-05 17:00:41
【问题描述】:

我想知道一种可以将堆栈指针的值存储到C中的变量中的方法。

【问题讨论】:

  • 请查阅您的 C 编译器手册,了解如何编写将寄存器与 C 变量相关联的内联汇编;然后将堆栈指针复制到该输出寄存器中。
  • 为什么?你希望堆栈指针到底指向什么?
  • TI 编译器无法从内联汇编中引用局部变量:e2e.ti.com/support/development_tools/compiler/f/343/p/264539/…
  • 我们真的需要知道您为什么需要它,以及您使用的是什么编译器。最通用和符合标准的方法是声明一个本地并获取其地址。当然,这不完全是SP,但可能足够接近。

标签: c assembly arm


【解决方案1】:

我发现内联 asm 是无用的,因为它是特定于编译器的,尤其是对于这样的事情,只需使用 asm 函数。对于 gnu 汇编器:

.thumb
.thumb_func
.globl GETSP
GETSP:
   mov r0,sp
   bx lr

在c中

extern unsigned int GETSP ( void );
...
unsigned int sp;
...
sp=GETSP();

了解您使用它的每个地方每次都会给出相同的值。对于许多编译器来说,整个函数会在整个函数中给出相同的结果,如果该函数被其他不同的函数重用,那么你可能会得到 sp 值的变化。

【讨论】:

  • 我认为最后一句话并不完全正确。例如alloca,应该修改值。
  • 并非所有编译器都预先分配堆栈帧,这是一种懒惰/简单的方法,您经常看到它,但很有可能让编译器不这样做,在这种情况下您会还可以看到 sp 因函数而异。
  • 我尝试使用函数指针方法,在该方法中我使用 void 函数类型,并使用该函数内部的内联汇编将 SP 的值移动到 R0 中。这有帮助。我可以通过之后的类型转换来设法将 SP 的值转换为 C 变量。
猜你喜欢
  • 1970-01-01
  • 2019-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多