c - IAR 汇编器 BKPT 立即数作为输入操作数

标签 c breakpoints inline-assembly iar

我正在为 Cortex M4 设备编写闪存加载程序,我想使用断点指令的立即值“返回”驱动 PC 应用程序的值。

虽然硬编码立即效果很好:

__asm("bkpt 0x70");
__asm("bkpt %0" : : "i" (0x70));

一旦我想“返回”依赖于运行时的东西,例如

uint8_t status = Flash_EraseAll();
__asm("bkpt %0" : : "i" (status));

编译失败

Error[Ta090]: Immediate operand is not constant

我尝试使用具有不同连接设置的预处理器宏,但无济于事。

有人知道如何将运行时相关状态标志输入到 __asm() IAR 中的 block 作为立即数?根据我读到的here ,这并不完全可能,但可能有一个聪明的 hacky 方法来做到这一点。

P.S.:是的,作为一种解决方法,我可以使用 switch 语句,在其中列出并硬编码每个可能的状态,但这只是丑陋且冗长。

最佳答案

我会将值压入堆栈,然后使用带有定义数字的 bkpt 指令,以便调试器可以在堆栈中查看此状态。

类似这样的东西(伪代码):

__asm("push %0" : : "i" (status));
__asm("bkpt %0" : : "i" (0x70));

当然,您不应该忘记事后清理堆栈。

由于 bkpt 仅使用立即数进行编码,因此您显然无法在运行时更改它,因为您必须修改代码。

关于c - IAR 汇编器 BKPT 立即数作为输入操作数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56344191/

相关文章:

c++ - 为什么 Visual C++ 不在特定函数中命中断点或单步执行?

visual-studio - 我可以在 Visual Studio (c++) 中设置断点以在线程上下文切换时中断吗?

c - 如何为这个内联汇编代码编写内联代码?

c++ - GCC 和 binutils build - C 编译器无法创建可执行文件

c - 什么是段错误(核心已转储)?

c - 如何查看调试可执行文件时包含的头文件(.h)?

java - 在 Eclipse 中调试 Java 在没有断点的情况下停止

c - 某些 strtok 调用出现段错误

c++ - 模板和内联优化乘法

objective-c - 为什么这个内联汇编调用libobjc中的release、retain和autorelease?