【问题标题】:Pushing and popping the same register via stack通过堆栈推送和弹出相同的寄存器
【发布时间】:2020-02-06 11:06:47
【问题描述】:

我想我理解 MSP430 中的 Push/Pop 概念到/从堆栈中,但不确定在这种情况下会发生什么:

mov #8, R10
push R10
call #myfunc

然后在子程序'myfunc'里面:

push R10
push R11
push R12

..... do some ops with R10
pop R10
pop R11
pop R12
ret

当我们再次按下 R10 并在 'ret' 之前弹出并以这种方式使用它时会发生什么? 'main' 中不再使用 R5。

我还是新手-谢谢

【问题讨论】:

  • 检查在使用 MSP430 时 C 代码的行为方式是否存在通用 ABI 或调用约定。调用者或被调用者是否应该进行堆栈,以及常用的寄存器等。该文档应该在 C 编译器文档中找到。然后在编写汇编程序时尽量遵循那个调用约定标准,这样你就可以无缝地混合 C 和 asm。
  • 为什么要提到 R5?您确定该函数使用的是 R10 而不是从内存中加载它吗?

标签: assembly stack embedded cpu-registers msp430


【解决方案1】:

如果你将同一个寄存器压入两次,则该值将存在于堆栈中的两个地址中。重复两次是没有意义的。

您还应该记住,push 和 pop 指令的数量应该匹配,以防止无用的数据堆积在堆栈中。您可以在通话前删除“push R10”,因为您在通话后已经这样做了。

编辑:您还应该以与推送它们相反的顺序拉动寄存器,以确保事情最终出现在各自的寄存器中

【讨论】:

  • 函数中push和pop指令的数量应该匹配主要是因为在执行ret时可能会在程序计数器中弹出无效地址。
最近更新 更多