Assembly 将32位ASM转换为64位ASM

Assembly 将32位ASM转换为64位ASM,assembly,64-bit,inline-assembly,masm,intrinsics,Assembly,64 Bit,Inline Assembly,Masm,Intrinsics,我知道x64不支持内联汇编。我对汇编不太熟悉,所以我想请任何精通汇编的人来帮助我。有人能把这段代码从32位转换成64位吗?我读过你可以使用MASM或编译器内部函数,但有点困惑如何转换这段代码 #define get_member_function_address_vc8(member_function_address, member_function_type)\ void* member_function_address; \ {

我知道x64不支持内联汇编。我对汇编不太熟悉,所以我想请任何精通汇编的人来帮助我。有人能把这段代码从32位转换成64位吗?我读过你可以使用MASM或编译器内部函数,但有点困惑如何转换这段代码

#define get_member_function_address_vc8(member_function_address, member_function_type)\
void* member_function_address;          \
{                                       \
    __asm                               \
{                                       \
    mov eax,offset member_function_type \
};                                      \
__asm                                   \
{                                       \
    mov member_function_address, eax    \
};                                      \
}

你好,马克。。。这是一些丑陋的代码。正如David Wohlferd在他的评论中所说的,VisualC++在支持64位处理器的时候不支持内联汇编,所以你需要做一些不同的事情。 首先,我将尝试解释这个宏试图实现的目标。所有汇编指令所做的都是将第二个宏参数中的32位值赋值给一个以传入的名称作为第一个参数声明的变量。它所做的似乎与这个宏相当:

#define get_member_function_address(varname, member_function) \
     void *varname = (void *)&(member_function);
该宏被称为
get\u member\u function\u address
,这一事实为我们提供了一个线索,说明了为什么宏的作者认为有必要使用内联汇编来获取对象的地址。它试图获取成员函数的地址,但这并不容易。在成员函数中使用UNAREA<代码>和/Cux>运算符确实给您一个像您所期望的成员函数的指针,但是指向C++中的成员函数的指针是特殊的。它们不仅仅代表成员函数的地址,因此不能将它们强制转换为
void*

遗憾的是,没有一种可移植的方法来找到C++中成员函数的地址。宏假定指向成员函数对象的指针的函数地址位于对象的开头。然而,编译器可以把它放在任何它想要的地方。显然,这个假设对于32位版本的VisualStudio2005(VS8)是正确的,但我不知道它是否也适用于任何其他版本

假设它没有改变,下面的代码应该是宏的替代品。它在针对32位和64位环境时都应该有效。也就是说,假设指向成员函数的指针在开始时具有成员函数的地址

template <class T>
static inline void *
_get_member_function_address(T member_function_ptr) {
    union {
        T mf;
        void *p;
    } u;
    u.mf = member_function_ptr;
    return u.p;
}

#define get_member_function_address_vs8(varname, member_function)   \
    void *varname = _get_member_function_address(&member_function);
模板
静态内联空洞*
_获取成员函数地址(T成员函数ptr){
联合{
T-mf;
void*p;
}u;
u、 mf=成员功能ptr;
返回u.p;
}
#定义get_member_function_address_vs8(varname,member_function)\
void*varname=\u get\u member\u function\u address(&member\u function);

模拟eax的64位寄存器称为RAX,您想做什么?该宏声明(而不是调用)一个函数,该函数将其第二个参数的内容移动到第一个参数,即它。此外,它是现代编译器可能不喜欢的非常老式的C(K&R参数类型声明,隐式int)。什么是
成员函数类型
?还要注意,如果使用Visual Studio,它不支持64位代码的内联asm。所以无论你想做什么,你都需要做得非常不同。member\u function\u type是一个类。这是我们试图从32位操作系统迁移到64位操作系统的遗留代码的一部分。谢谢。这是我们试图从32位操作系统迁移到64位操作系统的遗留代码的一部分。我将尽快尝试检查此代码。