②flag的設(shè)置的原因是:本地方法的參數(shù)的個(gè)數(shù)不是固定的,而OS20所提供的用匯編調(diào)用函數(shù)在回到函數(shù)入口點(diǎn)時(shí)只彈出Wptr"指向的4個(gè)單元的內(nèi)容,因此多余的參數(shù)出棧操作也必須通過調(diào)節(jié)Wptr手動(dòng)完成,通過向下移動(dòng)Wptr查找flag標(biāo)志,再調(diào)節(jié)Wptr到Wtpr+2即可正確地回到匯編函數(shù)。當(dāng)本地方法的參數(shù)完全手動(dòng)入棧后就可以手動(dòng)調(diào)節(jié)工作區(qū)指針Wptr而進(jìn)入到調(diào)用的本地函數(shù),函數(shù)返回后的第一件事是保存在寄存器中的函數(shù)的返回值到returnvalue,恢復(fù)工作區(qū)指針Wptr,并將本地方法的返回值類型作為嵌入?yún)R編的函數(shù)的返回值,此時(shí)就完成了由Java棧到C棧的轉(zhuǎn)換,并成功調(diào)用本地方法。
圖3Java棧到本地棧的轉(zhuǎn)換
結(jié)論
通過對(duì)Sun公司下載的CDC代碼的修改與編寫,對(duì)CDC中的加載的類做了一些裁減,并且將線程化的解釋器改為一次性解釋字節(jié)碼的單線程解釋器簡化程序,成功地生成了在機(jī)頂盒上可以運(yùn)行簡單的Java程序的虛擬機(jī)。