当前位置:  软件>C/C++软件

C/C++编译器 AsmJit

    来源:    发布时间:2015-01-22

    本文导语:  [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;
}

    
 
 

您可能感兴趣的文章:

  • 请教:JSP编译器编译成字节码,跟别的编译器编译出来的有什么不同呢?
  • 编译GCC时能不能只编译C/C++的编译器?
  • 关于arm交叉编译器4.3.3编译程序报错,但是3.4.5却能编译通过的问题
  • 问:关于gcc编译器和g++编译器
  • C编译器 c++编译器 wieldylcc
  • 请问gdb是不是只能调试gcc编译的程序,在unix下用其它编译器编译的程序是不是不一定能用gdb调试的?
  • 请问哪里有反编译.class文件的反编译器?
  • linux下有没有能编译出16bit代码的C语言编译器?
  • 求一个编译好的的gcc编译器
  • Solaris下编译器版本不同,编译后的物件大小不同?
  • 求购java的反编译器,要求反编译效果好的-急!
  • 请问在linux下编译程序怎么设置编译器字节对齐?
  • eclipse 的c编译器编译问题
  • 怎么查看arm平台上的程序是用那个版本的交叉编译器编译的????
  • 我想把Java源码编译本地的exe,因为用jvm太慢了,但是不知用啥编译器?
  • 关于如何判断gcc之类的编译器的编译结果?
  • 使用gcc编译器进行代码编译出来的程序是否遵循gpl协议
  • 谁有JAVA的反编译器?就是把.class反编译成.java的工具?或者有decafe pro的注册机?
  • 用-g编译器选项编译程序就在makefile中按下面样子的加进去吗:
  • 在linux+x86下用交叉编译器编译出能在solaris+x86运行的文件时遇到的问题
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 开源机器学习编译器 Milepost GCC
  • 编译器是怎么实现的?????
  • 请问Linux下,有图形界面的编译器吗?
  • 请问编译器是干什么用的
  • 哪有cc编译器下载?
  • 交叉编译器可以通用吗?
  • 问一下有什么方法可以用其它编译器伪装成GCC?
  • C语言编译器 Cilk
  • 找不到编译器????????求救::在线等待!
  • jsp编译器
  • gcc和cc和g++是一个编译器吗?
  • 谁有AIX 4.3.3下用的CC编译器.
  • linux 如何确定哪个编译器在执行
  • LINUX下使用Eclipse,如何使用交叉编译器?
  • 怎么样安装一个CC++编译器?
  • 编译器架构 LLVM
  • 关于java编译器
  • 请问,unix下的编译器支持c++的RTTI吗?
  • 要哪里下载gvim编译器,要怎么用呢,有中文版的吗
  • CUDA准实时编译器 Ocelot


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3