2011-06-03 105 views
2

我有另一种错误尝试使用-fasm块参数(这使英特尔风格汇编语法)与苹果GCC 4.2.1编译这在工作MSVC联汇编代码:块组件的操作数没有识别标签 'LASM $ TYPE' 使用,但不限定GCC内联汇编错误:块组件操作不承认

typedef struct _MyStruct 
{ 
    int data; 
    //... 
}MyStruct; 

void testAsm() 
{ 
    MyStruct *pMyStruct = new MyStruct(); // Please not that I create an instance of MyStruct here only for the sake of simplicity 

    _asm 
    { 
     mov edi, pMyStruct 
     add edi, TYPE MyStruct // error: block assembly operand not recognized. label 'LASM$TYPE' used but not defined 
     //... 
    }; 

    delete pMyStruct; 
} 


我该如何解决这个问题?

+0

你究竟想要做什么?我从来没有在Visual C++中看到这样的语法... – Goz 2011-06-03 09:58:45

+0

其实,这是我第一次看到它,我无法找到文档,它会覆盖它... – Ryan 2011-06-03 10:11:34

+0

我也遇到过这个问题 - 在另一个内联汇编代码中,使用了offset关键字:“mov eax,offset fptr”,其中fptr是一个函数“void fptr(void * pData)”...这次GCC报告错误“Block assembly operand not承认“:( – Ryan 2011-06-03 10:16:11

回答

1

TYPEMSVC-specificasm关键字。这里只是表示sizeof。我试图在网上找到一些gcc asm-block文档,但是十分钟后我放弃了。尝试

add edi,sizeof(MyStruct) 

和变体。我没有苹果,所以我无法为你尝试。

更新回答在评论的问题:试试这个:

add edi,__offsetof(MyStruct,MyMember) 

如果它不能正常工作,请参阅"Using the GNU Compiler Collection"的文档。

+0

谢谢,这似乎是工作!我还可以请你告诉我如何处理偏移关键字? – Ryan 2011-06-03 11:34:17

+0

@Ryan:见更新。 – TonyK 2011-06-03 11:52:43

+0

男子,我不能相信我错过了... ...非常感谢,托尼! – Ryan 2011-06-03 12:11:13