大約兩個(gè)多星期沒做JIT了,經(jīng)過之前些其他代碼消遣,現(xiàn)在還是繼續(xù)做下去的好。目前的成果是完成了匯編數(shù)據(jù)結(jié)構(gòu)、完成了匯編到機(jī)器碼的轉(zhuǎn)換器、知道了成員對(duì)齊、調(diào)用轉(zhuǎn)換的約定、知道如何實(shí)現(xiàn)異常處理以及完成了中間指令的數(shù)據(jù)結(jié)構(gòu)和檢查。現(xiàn)在需要做的事中間指令到匯編的轉(zhuǎn)換程序。
為了盡快看到結(jié)果(因?yàn)閮?yōu)化并不是JIT第一版的重點(diǎn)),完成一個(gè)C簡(jiǎn)化版編譯器,現(xiàn)在采取的策略如下:
1、不優(yōu)化,將每一條中間指令都轉(zhuǎn)換到幾條匯編指令,而忽略中間指令之間的關(guān)系。
2、將變量進(jìn)行4字節(jié)對(duì)齊。因?yàn)閤86要求參數(shù)要4字節(jié)對(duì)齊,那么變量也對(duì)其的話,將會(huì)簡(jiǎn)化很多事情。譬如說將一個(gè)8字節(jié)的函數(shù)結(jié)果(EDX:EAX)寫進(jìn)一個(gè)變量就很容易了。
3、如果出現(xiàn)大于8個(gè)字節(jié)的函數(shù)結(jié)果,那么在函數(shù)啟動(dòng)的時(shí)候?qū)AX存進(jìn)EBX。因?yàn)樽詈?jiǎn)單的指令生成方法是不需要?jiǎng)佑肊BX的。
4、函數(shù)開始的時(shí)候保存所有寄存器,結(jié)束的時(shí)候恢復(fù),不計(jì)算實(shí)際用了多少寄存器。
用了這么多層數(shù)據(jù)結(jié)構(gòu)將JIT要命的部分分離開了。以后即使上面有很多個(gè)語言,我重寫中間指令到匯編指令的代碼也是完全沒有影響的,實(shí)現(xiàn)了各個(gè)部分單獨(dú)變化的目標(biāo)。
posted on 2009-04-10 23:30
陳梓瀚(vczh) 閱讀(1934)
評(píng)論(1) 編輯 收藏 引用 所屬分類:
JIT