如何在运行时简化代码生成?

Fre*_*abe 17 c++ windows x86 assembly visual-c++

我正在研究一种在运行时生成汇编代码的软件.例如,这是一个非常简单的函数,它生成用于调用GetCurrentProcess函数的汇编代码(对于Win64 ABI):

void genGetCurrentProcess( char *codePtr, FARPROC addressForGetCurrentProcessFunction )
{
#ifdef _WIN64
  // mov rax, addressForGetCurrentProcessFunction
  *codePtr++ = 0x48
  *codePtr++ = 0xB8;
  *((FARPROC *)codePtr)++ = addressForGetCurrentProcessFunction;

  // call rax
  *codePtr++ = 0xFF;
  *codePtr++ = 0xD0;
#else
  // mov eax, addressForGetCurrentProcessfunction
  *codePtr++ = 0xB8;
  *((FARPROC *)codePtr)++ = addressForGetCurrentProcessFunction;

  // call eax
  *codePtr++ = 0xFF;
  *codePtr++ = 0xD0;
#endif
}
Run Code Online (Sandbox Code Playgroud)

通常我会使用内联汇编程序,但唉 - 这似乎不再适用于64位MSVC编译器.虽然我在这 - 我的代码应该与MSVC6一起使用到MSVC10和MinGW.还有更多的函数,比如genGetCurrentProcess,它们都发出汇编代码,其中许多都得到函数指针,可以作为参数传递.

令人烦恼的是,修改此代码很容易出错,我们必须手动处理ABI特定的事情(例如,在调用寄存器溢出函数之前保留32字节的堆栈空间).

所以我的问题是 - 我可以简化这段代码以便在运行时生成汇编程序代码吗?我的希望是我可以以某种方式直接编写汇编程序代码(可能在一个外部文件中然后用ml/ 汇编ml64)但是我不清楚如果汇编代码中的某些字节只在运行时知道它会如何工作(addressForGetcurrentProcessFunction例如,上例中的值).也许可以组装一些代码但是为代码中的某些位置分配"标签",以便我可以在运行时轻松修改代码然后将其复制到我的缓冲区中?

Tam*_*lei 11

看看asmjit.它是用于运行时代码生成的C++库.支持x64和最可能对现有扩展(FPU,MMX,3DNOW,SSE,SSE2,SSE3,SSE4)的.它的界面类似于汇编语法,它为您正确编码指令.