Я пытаюсь создать свой собственный JIT, и до сих пор мне удалось запустить очень простой ассемблерный код (в машинном коде), но у меня не получается понять, как вызывать функции таким образом. В Visual Studio я вижу функции в окне разборки.
Другой связанный с этим вопрос — как я могу вызвать Win32 MessageBox () в машинном коде?
Следующий вопрос: как мне вызвать внешние функции DLL / LIB таким образом?
Также есть какие-нибудь книги или учебники, которые могли бы научить меня этому предмету? Я пытался найти его, но получил результаты, такие как .NET, JVM и LLVM, которые, на мой взгляд, не совсем то, что я ищу.
Вот упрощенная версия кода, над которым я работаю:
#include <iostream>
#include <Windows.h>
int main(int argc, char* argv[])
{
// b8 03 00 00 00 83 c0 02 c3
unsigned char code[] = {
0xb8, // mov eax, 3
0x03, 0x00, 0x00, 0x00, // 3 (32 bit)
0x83, // add eax, 2 // 0x83 = add,
0xc0, // ModR/M with immediate 8 bit value
0x02, // 2 (8 bit)
0xc3 // ret
};
void* mem = VirtualAlloc(0, sizeof(code), MEM_COMMIT, PAGE_EXECUTE_READWRITE);
memcpy(mem, code, sizeof(code));
DWORD old;
VirtualProtect(mem, sizeof(mem), PAGE_EXECUTE_READ, &old);
int(*func)() = reinterpret_cast<int(*)()>(mem);
printf("Number is %d\n", func());
VirtualFree(mem, 0, MEM_RELEASE);
return 0;
}
Возможно ли иметь код сборки JIT для вызова функции C ++?
Перед этим проектом я сделал интерпретатор байт-кода на C ++, но меня не очень порадовала скорость сравнения его с эквивалентной тестовой программой на C #. C # был примерно в 25 раз быстрее. Поэтому я наткнулся на то, что называется JIT, чтобы сделать это быстрее. Поэтому я надеюсь, что вы все можете увидеть, где я беру этот проект JIT. И, возможно, если это возможно, сделайте так, чтобы он обрабатывал GUI.
Возможно, вы найдете несколько руководств по написанию компилятора / компоновщика. Это может помочь с реализацией / вызовом динамических библиотек.
Я не уверен, что именно вы подразумеваете под вызовом функций C ++. В любом случае я написал следующую демонстрационную программу, которую вы можете посмотреть и посмотреть, поможет ли она вообще.
#include <Windows.h>
#include <iostream>using namespace std;
__int64 sub(__int64 a, __int64 b)
{
return a - b;
}
int main(int argc, char **argv)
{
char code[] =
{
0x48, 0x89, 0xC8, // mov rax, rcx
0xC3, // ret
0x48, 0x83, 0xEC, 0x20, // sub rsp, 0x20
0xFF, 0xD0, // call rax
0x48, 0x83, 0xC4, 0x20, // add rsp, 0x20
0xC3 // ret
};char *mem = static_cast<char *>(VirtualAlloc(0, sizeof(code), MEM_COMMIT, PAGE_EXECUTE_READWRITE));
MoveMemory(mem, code, sizeof(code));
auto setFunc = reinterpret_cast<void *(*)(void *)>(mem);
auto callFunc = reinterpret_cast<__int64 (*)(__int64, __int64)>(mem + 4);
setFunc(sub);
__int64 r = callFunc(0, 1);
cout << "r = " << r << endl;
VirtualFree(mem, 0, MEM_RELEASE);cin.ignore();
return 0;
}
Других решений пока нет …