Visual Studio 2010 x64 __setReg等效编译器内在

时间:2013-02-11 16:56:23

标签: windows visual-studio-2010 assembly x86-64 intrinsics

我有一个用C编写的应用程序,我真的需要在调用函数之前修改其中一个处理器寄存器的值。通常我会使用内联汇编来执行此操作,但是我们都知道已经删除了64位应用程序。由于某些项目限制,我也无法在使用ml64编译的单独.asm文件中执行此操作。所以基本上我需要在内联执行以下代码的等价物:

_asm mov r10d, 0xDEADBEEF

有没有人知道x64的创意方法或其他一些内在的编译器,它们允许你修改内联寄存器的值?

1 个答案:

答案 0 :(得分:1)

不幸的是,在查看可能的解决方法之后,Hans似乎是正确的,并且根本无法修改内联寄存器的内容。没有编译器内在存在来执行它,唯一的替代方法是将64位程序集中的整个函数作为单独的.asm文件编写并使用ml64编译,或者像Alexey建议的那样并在之前分配可执行的内存块手并将操作码写入其中。然后,您可以创建一个函数指针,并直接调用此代码。例如,如果我想做相同的:

mov r10d, ecx
ret

只需创建一个数组来存储操作码:

BYTE copyValueToR10[] = "\x44\x8B\xD1\xC3";

然后,您可以使用具有PAGE_EXECUTE保护的这个微小功能的VirtualAlloc内存。接下来只需创建一个函数指针,你就可以了。绝对是一种肮脏的方式,但考虑到没有内联asm或想要使用ml64进行编译的限制,这似乎是唯一的另一种方法。