我正在将32位C++代码移植到VS2008中的64位上。老代码包含了混合编写的汇编代码。
例如:
__asm
{
mov esi, pbSrc
mov edi, pbDest
...
}
我曾经在某个地方读到,需要删除所有的汇编代码并将它们放在一个单独的项目中,然后以某种方式链接到它。有人能给我提供一步一步的操作过程吗?我知道C++和C#,但不懂汇编语言。谢谢。
我正在将32位C++代码移植到VS2008中的64位上。老代码包含了混合编写的汇编代码。
例如:
__asm
{
mov esi, pbSrc
mov edi, pbDest
...
}
我曾经在某个地方读到,需要删除所有的汇编代码并将它们放在一个单独的项目中,然后以某种方式链接到它。有人能给我提供一步一步的操作过程吗?我知道C++和C#,但不懂汇编语言。谢谢。
在64位平台编译时,Visual C++ 2005、2008或2010不支持内联汇编。x64 ASM有太多的细节和复杂性可能会破坏__asm
块周围的C(++)代码,因此不允许它。简而言之,没有“移植”的方法。
建议使用64位内部函数与#define
和#ifdef
,当尝试跨架构编译这种低级代码时。请查看:http://msdn.microsoft.com/en-us/library/h2k70f3s.aspx
编辑:然而,如果你真的知道你在做什么,你可以将正确的ASM字节码保存在某种缓冲区数组中,并通过void*
指针和VirtualProtect()
或类似的东西执行“原始”代码。当然,你需要了解x64调用/返回约定,因为你实质上是在调用一个函数。请注意,这99.9%的时间是一个坏主意。
如果您无法使用内置函数执行任务,或者无法在C / c ++中编写等效代码,则必须深入了解x64汇编语言。从高层次来看:
1)假设您从x86汇编语言例程开始,您需要将它们移植到x64。
2)使用ML64(Microsoft x64汇编器)或等效汇编器将您的例程汇编为.OBJ文件,以便您可以将其链接到C / C ++项目中。
3)设置自定义构建步骤,调用汇编器处理.ASM文件。
祝你好运!