c - 了解stm8s反汇编中的功能?

标签 c assembly embedded disassembly stm8

我正在使用 STVD IDE 对 STM8S 微 Controller 进行编程。它使用 COSMIC 编译器。

我发现有一个veriable意外增加了。调试的时候发现汇编代码中有一行导致这个变量增加了值。这是一个名为 c_lgadc 的函数。有时在调用堆栈中没有显示 ADC 相关函数时调用此流水线。

我不明白这段代码是从哪里来的,这个c_lgadc是什么?我在名为 c_lgadc

的 C 代码中没有函数

这是反汇编的屏幕截图。 enter image description here

更新:

  • 我不知道应该检查什么 C 代码,因为调用堆栈是 每次调用此反汇编线时都不同。
  • 我注意到当我跨过或进入调试器时,它会出现 到特定定时器 ISR 的最后一行。
  • 我还注意到带有第二个断点的行是导致添加到我的变量的行。 具有第一个断点的行总是被调用 5 次,然后是该行 第二个断点被调用一次,依此类推。
  • 我想知道我应该如何进一步调试它以防止意外添加到我的变量中。

更新 2:

我在 map 文件中找到了以下内容:

c_lgadc 0000f39c defined in (C:\Users\xxxxxxxx\CXSTM8\Lib\libm0.sm8)lgadc.o section .text
                 used in Debug\stm8s_it.o

我不确定这是否有助于澄清问题?

最佳答案

I've noticed that when I step over or into in the debugger, it comes to the last line of a specific timer ISR.

所以,这个计时器 ISR 递增一个 4 字节整数变量,并且这个变量与你的变量重叠。通过检查该 ISR 或链接映射可以揭示这种重叠是如何发生的,或者可能是索引寄存器 X 在 ISR 中设置不正确。

关于c - 了解stm8s反汇编中的功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56027678/

相关文章:

c - 如果路径错误,则 execvp() 返回值

assembly - ARM,带链接的分支,BL 与 MOV,B

c - 用指针反转 C 中的字符串文字

c - 来自 GTK 的 gst_video_overlay_set_window_handle#

c - 从 GCC 获取函数十六进制代码

assembly - `dup (?)` 在 TASM 中是什么意思?

C 指向另一个结构体的指针

c# - 在 .NET Micro Framework 中将 'float' 转换为 'byte[4]' 并返回 'float'

c - 如何指定存储函数的内存位置?

c++ - g++ 链接器抛出对 xxxx 的 undefined reference