我的C++代码中夹杂着汇编代码。如何将其移植到64位?

3

我正在将32位C++代码移植到VS2008中的64位上。老代码包含了混合编写的汇编代码。
例如:

__asm

{
  mov esi, pbSrc
  mov edi, pbDest

  ...

}

我曾经在某个地方读到,需要删除所有的汇编代码并将它们放在一个单独的项目中,然后以某种方式链接到它。有人能给我提供一步一步的操作过程吗?我知道C++和C#,但不懂汇编语言。谢谢。

2个回答

4

在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%的时间是一个坏主意


1

如果您无法使用内置函数执行任务,或者无法在C / c ++中编写等效代码,则必须深入了解x64汇编语言。从高层次来看:

1)假设您从x86汇编语言例程开始,您需要将它们移植到x64。

2)使用ML64(Microsoft x64汇编器)或等效汇编器将您的例程汇编为.OBJ文件,以便您可以将其链接到C / C ++项目中。

3)设置自定义构建步骤,调用汇编器处理.ASM文件。

祝你好运!


是时候去了解ML64了。谢谢。 - ramrocket

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接