好多编译器都有 __irq 关键字,好像VC没有,请问如何利用VC实现,函数开始的时候 寄存器统统入栈,结束的时候都出来呀?

解决方案 »

  1.   

    PUSHAD指令压入32位寄存器,使他们按照EDI,ESI,EBP,ESP,EBX,EDX,ECX,最后是EAX的顺序出现在堆栈中。 
      

  2.   

    #define SAFE_CALL(x) \
    _asm {pushad}; \
    x; \
    _asm {popad};
    调用时这样操作:
    比如有函数func
    void func(int a,char* b)
    {
    ...
    }SAFE_CALL((func(10,NULL));就行了
      

  3.   

    我终于想明白了,靠中断并不安全。只有靠消息队列。
    中断发生时,即便是做到保护现场。也存在中断嵌套问题。系统变得不稳定。如果不允许嵌套,很有可能丢消息。而且如果保护现场不是原子的。这个时候中断,将是灾难性的。还有浮点寄存器要保护......... 总之,还是消息队列安全稳定。可能就是因为这个vc并没有__irq 关键字。