注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

太阳神上的博客

青青子衿,悠悠我心,但为君故,沉吟至今。

 
 
 

日志

 
 
 
 

用GNU Lightning实现循环  

2008-02-05 22:23:51|  分类: 程序设计创意 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
  GNU Lightning是一个比较好用的JIT库。不过由于用了过多的宏,几乎没法调试,而且由于宏调用的关系,有些用函数调用看起来是等价的代码,但宏调用就出了问题。我一直想用这个GNU Lightning所提供的JIT技术来优化我的Tenshi脚本语言,可是在实现循环时就出了问题,而我的这个循环是按照它的文档里提供的例子来改的,应该没什么问题。可总出来是死循环。我发了邮件给GNU Lightning的维护者Bonzini,可是他却一直没给我回信。难道GNU Lightning停止了?因为它的最新版还是2004年11月份的,也就是说已经有三年没动过了,这真是一件麻烦事,而且它的源代码可以说是宏滥用,而我对汇编的对应二进制形式也不清楚,出了问题真是麻烦。
  我原来是这样做的:
 #include <stdio.h>
#include <lightning.h>

int main()
{
jit_insn code_buffer[1024];
typedef void (*func_t)();
func_t foo=(func_t)(jit_set_ip(code_buffer).ptr);
jit_insn *loop; /* start of the loop */

jit_prolog (0);
jit_movi_i(JIT_R0,10);

jit_prepare(2);
jit_pusharg_i(JIT_R0);
jit_movi_p(JIT_R1,"Set R0 to %d\n");
jit_pusharg_p(JIT_R1);
jit_finish(printf);

loop= jit_get_label();

jit_prepare(2);
jit_pusharg_i(JIT_R0);
jit_movi_p(JIT_R1,"Iterator is %d\n");
jit_pusharg_p(JIT_R1);
jit_finish(printf);

jit_calli(getchar);
jit_subi_i (JIT_R0, JIT_R0, 1);

jit_bnei_i (loop, JIT_R0, 0);
jit_ret ();

jit_flush_code(code_buffer, jit_get_ip().ptr);

foo();

getchar();
return 0;
}
  可是结果是一个死循环,我后来意识到一个问题,可能是在调用printf函数时,改变了迭代寄存器JIT_R0的值,果然,把JIT_R0改为了另外一个寄存器JIT_V0就没问题了,原来JIT_R0是用来寄放函数返回值的,调用函数后这个值就总是被重置,所以是死循环。
  评论这张
 
阅读(153)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017