要了解stm8s反汇编中的功能吗?

时间:2019-05-07 17:24:21

标签: c assembly embedded disassembly stm8

我正在使用STVD IDE编程STM8S微控制器。它使用COSMIC编译器。

我发现确实有一个确实增加的确凿证据。调试时,我发现汇编代码中有一行导致该变量增加其值。这是一个名为c_lgadc的函数。有时,在调用堆栈中未显示任何与ADC相关的函数的情况下调用此组装线。

我不知道此代码来自何处,c_lgadc是什么?我的C代码c_lgadc

中没有任何功能

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

更新:

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

UPDATE2:

我在map file中发现了以下内容:

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

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

2 个答案:

答案 0 :(得分:2)

  

我注意到,当我进入调试器或进入调试器时,它到达特定计时器ISR的最后一行。

因此,此计时器ISR会增加一个4字节的整数变量,并且此变量与您的变量重叠。通过检查ISR或链接映射可以揭示这种重叠的发生方式,或者可能是在ISR中没有正确设置索引寄存器X。

答案 1 :(得分:1)

函数c_lgadc看起来像是运行时库的一部分。根据上下文的建议,它可能是加进位标志函数,因为它介于 compare unsigned right shift 函数之间。

这些函数的c_lc_lg前缀可能是方案的某些部分,用于指示操作数的类型或其结果。

关于您的问题,adc出现在几种CPU体系结构的指令集中,即Intel x86和motorola 680x。这意味着:

  • 如果进位标志(无符号算术上溢或通过进位标志移位)为零,则返回操作数作为结果。
  • 如果设置了进位标志,则将结果作为加到操作数上的结果返回。