我在生成的汇编列表中有以下C代码:
// 359 // File must contain at least the Base64 SHA-1/HMAC
// 360 if (m_fileLength < AsciiSignatureLength)
LDR R0,[R6, #+8]
CMP R0,#+40
IT LT
// 361 {
// 362 retVal = InvalidCrc;
MOVLT R5,#+2
BLT.N ??readSignatureNC_2
// 363 }
这是在ARM Cortex M3(STM32f1xx)和具有高优化设置的IAR编译器上运行的。进入此函数时,m_fileLength的值为55,AsciiSignatureLength为const 40。 根据调试器,R0正确获取值55. CMP正确设置APSR寄存器标志,但由于某种原因,当IT LT命令执行时,它会转储到“then子句”中,导致retval等于InvalidCRC。
在没有优化的情况下编译时,这个相同的c代码会生成一个cmp,后跟一个完全按预期工作的BNEQ程序集。
我已经四处寻找与stm32中的IT LT命令有关的时代,并且没有找到任何东西,看起来IAR编译器似乎没有为给定的c代码生成“坏”程序集,除非我在这里误解了一些内容。 谢谢,乔希