Вызов функций из сборки x86_64

Я пытаюсь создать свой собственный 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.

0

Решение

Возможно, вы найдете несколько руководств по написанию компилятора / компоновщика. Это может помочь с реализацией / вызовом динамических библиотек.

Я не уверен, что именно вы подразумеваете под вызовом функций 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;
}
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]