混合c / asm项目(x64)产生一个“未解决的外部”(修复所有其他!)

时间:2013-11-26 21:17:51

标签: c++ visual-studio-2010 assembly x86-64

我有一个Visual Studio项目,我想用32位和64位变体构建。它是99%用C /​​ C ++编写的,但有一个用汇编语言编写的函数。在32位中,我在cpp文件中有asm代码,如下所示:

#ifndef X64
__declspec( naked ) void ERR ( )
{
    SeqNum = 0;
    SeqTimeStamp++;
    __asm
    {
        mov EAX, MinusTwo
        mov EBP, SaveBP
        sub EBP, 4
        mov ESP, EBP
        pop EBP
        ret 8
    }
}
#endif

引用的全局变量在同一文件的顶部定义如下:

extern "C"
{
DWORD           SeqTimeStamp, SeqNum;
void            *SaveBP;
}

这编译并构建良好。 (并且也有效!:-))

对于64位构建,没有内联asm支持,相同的基本算法在.ASM文件中编码。我有Visual Studio(2010)很好地构建这个文件,并将其包含在链接调用中。该代码如下所示:

EXTERN SaveBP:PTR
EXTERN SeqNum:DWORD
EXTERN SeqTimeStamp:DWORD
.CODE
ERR PROC PUBLIC FRAME
PUSH RBP
MOV RBP, RSP
.ENDPROLOG
MOV SeqNum, 0
MOV EAX, SeqTimeStamp
INC EAX
MOV SeqTimeStamp, EAX
MOV RAX, 0FFFFFFFEh
MOV RBP, SaveBP
LEA RSP,[RBP+0]
POP RBP
RET 0
ERR ENDP
END

我在这个版本中获得了一个未定义的外部: ERR.obj:错误LNK2019:函数ERR中引用的未解析的外部符号SaveBP

我尝试了许多不同的方式来声明和引用SaveBP,但我还没有找到一个成功的组合。有没有其他人遇到类似的情况,或者可能知道如何解决它?

0 个答案:

没有答案