我有一个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,但我还没有找到一个成功的组合。有没有其他人遇到类似的情况,或者可能知道如何解决它?