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


