J2ME中的CDC移植
由于Linux有多个通用寄存器,在实现该函数的代码中充分运用了如esp、ebp、esi等寄存器,但是OS20提供的可操作的寄存器只有3个通用寄存器Areg、Breg、Creg和1个工作指针寄存器Wptr(相当于堆栈指针),在实现过程中,我们用在C函数中设立局部变量来代替Linux的通用寄存器,通过手动调整工作栈指针来实现本地方法的调用,具体实现过程如图3所示。
当进入汇编函数时,工作区指针为Wptr,实参、状态寄存器和指令指针寄存器的值全部自动入栈,然后是我们定义的代替Linux寄存器的局部变量自动入栈,此时的Wptr自动移到Wptr′,利用OS20的汇编指令,手动将实参传递过来的参数通过计算得到本地方法参数的个数,然后将本地方法所需的参数依次压栈,最后再手动调节工作区指针实现本地方法的成功调用。这里我们先将本地方法函数指针和1个标志位flag(0x10101010)入栈,原因有两个:
①当随后我们手动调节工作指针Wptr′到Wptr"时,工作栈已由先前的嵌套汇编的函数进入到了要调用的本地方法的C函数,因此先前的函数的局部变量在此时无效,也就是说此时如果用以前实参传递过来的本地函数指针调用本地的函数肯定不会成功,因此要把这个函数指针先手动保存起来。
②flag的设置的原因是:本地方法的参数的个数不是固定的,而OS20所提供的用汇编调用函数在回到函数入口点时只弹出Wptr"指向的4个单元的内容,因此多余的参数出栈操作也必须通过调节Wptr手动完成,通过向下移动Wptr查找flag标志,再调节Wptr到Wtpr+2即可正确地回到汇编函数。当本地方法的参数完全手动入栈后就可以手动调节工作区指针Wptr而进入到调用的本地函数,函数返回后的第一件事是保存在寄存器中的函数的返回值到returnvalue,恢复工作区指针Wptr,并将本地方法的返回值类型作为嵌入汇编的函数的返回值,此时就完成了由Java栈到C栈的转换,并成功调用本地方法。
图3 Java栈到本地栈的转换
结论
通过对Sun公司下载的CDC代码的修改与编写,对CDC中的加载的类做了一些裁减,并且将线程化的解释器改为一次性解释字节码的单线程解释器简化程序,成功地生成了在机顶盒上可以运行简单的Java程序的虚拟机。
(编辑:daisy)
价格面议
[查看详情]
关于我们 | 联系我们 | 友情链接 | 诚聘英才 | 意见反馈 | 版权声明 | 网站地图 | 广告服务 | 欢迎投稿 | 免费注册
版权所有 数字视听网 Copyright © 2006-2019. All Rights Reserved 京ICP备06048189号-2 北京市公安局朝阳分局网监中心备案编号:1101051445
QQ群服务:厂商群(146100746) 经销商群(160287492) 投影机群(154576638) 专业音响群(160287677)
服务热线:010-62536866/82627795 传真:010-82627795