关于楼主的这个bug:
for (i=0;i<100;i++)
{
_asm_func();
}
我提个小意见:为什么不在_asm_func()中对用到的通用寄存器做备份呢?我们无法确定编译器会用栈还是寄存器存储临时变量。
几个月前我们也遇到过一个诡异的野指针问题,只要开二级优化就会出现(PPC上的,gnu4.3.3)。最后定位发现在一个C函数流程中,r23(一个函数返回的局部指针)被意外修改。那时我们首先怀疑的是编译器,因为这个问题是更新了编译器才出现的,而且只有开优化才有。但是最后单步发现还是代码的问题:在这个函数流程中出现了data tlb miss,在tlb miss中断中(汇编写的)刚好写了r23,而且写之前没备份,搞坏了那个指针。巧的是,如果不开优化,反汇编出来发现r23根本没被使用,代码会再次从栈里取指针,所以不出这个问题。
这个bug让我深刻体会到,C和汇编混合编程时需要格外小心。 |