TCL
创维
康佳
快速搜索:

J2ME中的CDC移植

2013年07月30日 11:06  来源:中国有线电视  作者:刘俊 张萍 姚莉 于鸿洋  字体【   

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栈到本地栈的转换

图3 Java栈到本地栈的转换

结论

通过对Sun公司下载的CDC代码的修改与编写,对CDC中的加载的类做了一些裁减,并且将线程化的解释器改为一次性解释字节码的单线程解释器简化程序,成功地生成了在机顶盒上可以运行简单的Java程序的虚拟机。

(编辑:daisy)

上一页123下一页
本文导航
[华为]C2510(BCF:G30)
[华为]C2510(BCF:G30)
价格:面议
[华为]DC3560
[华为]DC3560
价格:面议
[康佳]HDC970
[康佳]HDC970
价格:面议
[康佳]HDT299
[康佳]HDT299
价格:面议
[康佳]SDT400
[康佳]SDT400
价格:面议
MAXHUB
索尼
快捷
产品关注排行