当前位置: 软件>C/C++软件
C/C++编译器 AsmJit
本文导语: [AsmJit] 是個以 C++ 封裝的 JIT (Just-In-Time) Assembler,目前支援的硬體架構有 x86 與 x86_64,以 MIT X License 釋出。或許讀者對這樣的 Assembler 沒有太大的興趣,但專案卻跟 Google Chrome 瀏覽器引擎有些淵源。怎麼說呢?去年九月,Google 發...
[AsmJit] 是個以 C++ 封裝的 JIT (Just-In-Time) Assembler,目前支援的硬體架構有 x86 與 x86_64,以 MIT X License 釋出。或許讀者對這樣的 Assembler 沒有太大的興趣,但專案卻跟 Google Chrome 瀏覽器引擎有些淵源。怎麼說呢?去年九月,Google 發佈了新一代網路瀏覽器 Chrome,當時幾乎佔據了各大資訊新聞的版面。發佈瀏覽器的同時,還伴隨了一本畫冊,以平實且幽默的和漫畫,闡述新推出的 Chrome 瀏覽器的各功能,包含其中嶄新的 JavaScript (ECMAScript) 執行引擎,搶了風采,讓同等級的瀏覽器頓時失色。由 Google 將其代號命名為 [V8],強調有如 V8 賽車的高速 JavaScript 執行效率,可見 Google 的開發決心。
// Create simple DWORD memory copy function for 32 bit x86 platform:
// (for AsmJit version 0.8+)
//
// void ASMJIT_CDECL memcpy32(UInt32* dst, const UInt32* src, SysUInt len);
// AsmJit library
#include
#include
// C library - printf
#include
using namespace AsmJit;
// This is type of function we will generate
typedef void (*MemCpy32Fn)(UInt32*, const UInt32*, SysUInt);
int main(int argc, char* argv[])
{
// ==========================================================================
// Part 1:
// Create Assembler
Assembler a;
// Constants
const int arg_offset = 8; // Arguments offset (STDCALL EBP)
const int arg_size = 12; // Arguments size
// Labels
Label L_Loop;
Label L_Exit;
// Prolog
a.push(ebp);
a.mov(ebp, esp);
a.push(esi);
a.push(edi);
// Fetch arguments
a.mov(edi, dword_ptr(ebp, arg_offset + 0)); // get dst
a.mov(esi, dword_ptr(ebp, arg_offset + 4)); // get src
a.mov(ecx, dword_ptr(ebp, arg_offset + 8)); // get len
// exit if length is zero
a.jz(&L_Exit);
// Bind L_Loop label to here
a.bind(&L_Loop);
a.mov(eax, dword_ptr(esi));
a.mov(dword_ptr(edi), eax);
a.add(esi, 4);
a.add(edi, 4);
// Loop until ecx is not zero
a.dec(ecx);
a.jnz(&L_Loop);
// Exit
a.bind(&L_Exit);
// Epilog
a.pop(edi);
a.pop(esi);
a.mov(esp, ebp);
a.pop(ebp);
// Return
a.ret();
// ==========================================================================
// ==========================================================================
// Part 2:
// Make JIT function
MemCpy32Fn fn = function_cast(a.make());
// Ensure that everything is ok
if (!fn)
{
printf("Error making jit function (%u).n", a.error());
return 1;
}
// Create some data
UInt32 dst[128];
UInt32 src[128];
// Call JIT function
fn(dst, src, 128);
// If you don't need the function anymore, it should be freed
MemoryManager::global()->free((void*)fn);
// ==========================================================================
return 0;
}