這是我在Stack Overflow上的第一篇文章,所以我希望我能夠正確地做到這一點。 ;-)何時在TriCore仿真器中加載操作數?
我想開發一個TriCore仿真器,但不能決定何時加載操作數的指令。 TriCore也許是一種相當晦澀的微控制器,所以讓我稍微解釋一下這個架構。
有兩種類型的指令,16位和32位。無論是16位還是32位,都由最後一個字節的位0決定;由於字節順序是小端,它總是內存中的第一個字節。那裏沒問題。
這兩種指令類型有幾種操作碼格式,16位爲14,32位指令爲25。操作碼分爲兩個獨立的操作碼字段,儘管大多數16位操作碼只有一個操作碼字段。第一個操作碼字段位於低8位;它直接描述16位指令的指令,對於32位指令中的許多指令,它描述了操作數編碼,而第二個字段描述了實際的指令(但當然也有例外)。
我的計劃是總是提取所有的操作碼字段(這有點煩人,因爲第二個字段的位置對於所有指令格式都不一樣),並將它們放在一起放入一個16位的值中,該值將用於一個函數指針表。
根據這個值,我想提取操作數。例如,在32位指令中,第一個操作碼是0x8B
,操作數是兩個數據寄存器和一個9位常量。但是,有一些例外是非常乏味的:
指令ADD.A
和ADDSC.A
都具有操作碼1 == 0x01
。但是ADD.A
使用三個地址寄存器,而ADDSC.A
使用兩個地址寄存器,一個數據寄存器和一個索引,編碼到指令中。
最後我的問題是:在執行指令之前,在像這樣的體系結構中加載操作數是否可行?或者,最好先調用指令函數並在那裏提取操作數?
任何有興趣,指令集手冊是在這裏:http://www.infineon.com/dgdl/tc_v131_instructionset_v138.pdf?folderId=db3a304412b407950112b409b6cd0351&fileId=db3a304412b407950112b409b6dd0352
感謝您的任何提示!
順便說一句:選擇的語言是C或C++。
(按要求,我插入了我的想法到我原來的問題。)
嗯,我廣泛想過我有不同的選擇,我想我會用下面的解決。
我要分整個過程分爲兩個部分:
- 程序分析和操作數提取
- 執行
在第一步驟中,每個指令被加載並對準到32位。然後,將加載的指令與一組位掩碼進行比較,以確定正確的操作碼,這不僅告訴我最終必須執行哪些操作,還會告訴我如何加載操作數。在地址模式特定的函數中,操作數被加載到指針中;指令立即被存儲在必要時。
這歸結爲一個結構與此類似:
struct instruction_t {
int32_t **operands;
int32_t *immediates;
};
這將基本分配給每個指令(最大的缺點:存儲器消耗I計算這樣的結構作爲最壞的情況下約爲40字節(帶64位指針),這意味着一個通常只有16位指令的4兆字節的程序最終將佔用大約80兆字節的內存,另一方面我認爲執行速度可能相當快)。使用這種方法,我可以實現每條指令一次,因爲無論我的操作數如何加載都無關緊要,而且使用相同的一組操作數執行相同的指令的行爲將與真實機器上的行爲相同。代碼的執行只意味着通過選擇正確的結構並相應地調用指令函數來加載正確的操作數組。
我知道還有其他方法 - 我特別喜歡動態重新編譯。但是,這個系統對於不同的片上組件和I/O映射寄存器來說相當複雜,無論如何都會增加大量的樣板代碼。
我真的很感激我的方法的一些意見。也許你知道一個更好的方法來做到這一點?
謝謝!
這樣做最好是編輯原始問題,而不是單獨回答。 – 2012-06-15 08:31:35