Я пытаюсь создать свой собственный JIT, и до сих пор мне удалось запустить очень простой код сборки (в машинный код), но возникли проблемы с выяснением способа вызова функций таким образом. В Visual Studio я могу видеть функции в окне разборки.Функции вызова из сборки x86_64
Другой связанный с этим вопрос - как я могу назвать 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. И, возможно, если возможно, это поможет графическому интерфейсу.
Конечно, это возможно. Газиллион примеры, возможно, посмотрите на [мир привет] (http://stackoverflow.com/a/1032422/547981) для начала. Сборка его вручную не будет забавой. Обратите внимание, что вызовы функций вряд ли будут вашим узким местом. – Jester
Обычно я пишу образец программы в C/C++, а затем код сборки для компилятора, чтобы получить имена уровня сборки и последовательность вызовов. В случае с Visual Studio 2015, printf теперь является частью файла include, что означает, что он эффективно интегрируется с кодом C/C++. Один из способов борьбы с этим - создать проект, содержащий файл C для printf, и файл сборки для остальной части проекта. Может существовать возможность импортировать конкретные библиотеки, которые по-прежнему включают старый стиль printf. – rcgldr
Ну, IIRC, можно согнуть clang, чтобы скомпилировать источник C в память, а затем JIT его LLVM в машинный код и запустить его, поэтому, изучая источники LLVM, вы, вероятно, получите ответы ... через несколько лет ... Это также непонятно для меня, почему вас беспокоит интерпретируемая скорость языка, просто записывайте части производительности на C++ и сборку, JIT, как правило, вряд ли будет в порядке в лучшем случае и будет хуже в любом правильно настроенном случае производительности. Для неэффективных критических частей 25x тоже не имеет значения. Хотя это может быть хорошим упражнением, чтобы вы поняли, насколько классный C++. :) – Ped7g