1

我在 C++/CLI 中使用内联 asm。可怕的问题实际上可能是我观察到的错误。我将向量从一个函数调用传递给另一个。如果我在被调用函数中注释 _asm{....some assembly code here} 的整个代码片段,其中使用了从其他函数提供给它的向量,那么没有问题整个向量会很好并成功复制到被调用函数的参数以正确的方式。

但是如果取消 _asm{} 我的意思是如果我在被调用函数中使用 _asm{} 补丁,它会破坏对象的整个向量,事实上整个对象会破坏,其中包含向量和其他字符串数据,它只显示对象内部的每个数据,例如 npos=4294967295 .

它是什么?为什么会这样?是 CLI 造成问题还是我使用内联 asm 的方式错误?

请帮帮我,因为我被困在这里。

             strParamType  = strReturnType;
             if(strParamType.find("IDispatch")!=string::npos)
             {
                 IDispatch* pIDispatch; 
                 _asm
                 {
                   mov  esi,esp 
                       lea  eax,[pIDispatch] 
                   push eax
             }
              }

在这里,如果我在 _asm{} 内根本没有写任何东西,那么就会出现我描述的问题。

问候乌斯曼

4

1 回答 1

3

从您提供的来源我无法完全猜出您打算做什么,但我有一些观察:

  1. 尤其是_asm在 .NET 环境中使用时,您需要遵守一组规则。例如,请参阅Microsoft 的建议
  2. 您的代码未初始化pIDispatch。我不知道您的真实代码中会出现什么,但是汇编代码会获取堆栈上指针的地址,然后将其再次存储在堆栈中。这很麻烦,除非您的代码尝试初始化指针。但是在 if 子句之后,指针将超出范围!
  3. 您的汇编代码更改堆栈指针而不恢复它。这会导致你的进程崩溃,这是肯定的。除非您真的知道自己在做什么(例如编写操作系统),否则不要这样做。
于 2011-11-26T05:18:42.190 回答