2014-01-25 51 views
2

我想知道以下內容:組裝指令的光禿禿的骨頭

是否可以創建一小組彙編指令一起執行所有可能的操作? 或者mayby以不同的方式詢問關於任何體系結構的Must-Have Assembly指令是什麼? (例如,跳轉和添加將是neccecary做任何事情)

我希望你們能幫助我!

提供一些背景信息!我試圖爲我的編譯器設計一箇中間語言,我想盡可能少地使用指令(之後可以用一堆指令代替一個複雜指令對於特定的體系結構)當然,IL本身應該是可移植的。

+2

當然有一個「最小需求集合」的概念。許多CPU都是圍繞「微碼」的概念設計的,其中您提供的機器指令實際上是作爲CPU內部的「微碼」例程執行的。微碼是一個更基本和更小的一組操作。只要你獲得了你需要的功能,它就是你想要如何定義的。作爲編譯器的中間語言,許多語言都有一箇中間的「pcode」。但是,「pcode」通常在組件級別不起作用。 – lurker

+0

嗯,你能指出我如何設計自己的微碼正確的方向|中級語言?感謝您的回答!我很高興我的假設這次沒有那麼瘋狂:P –

+2

http://en.wikipedia.org/wiki/One_instruction_set_computer –

回答

3

最小值爲one instruction,它是在carbone nanotube computerMAXQ chip

雖然只是一個在現實中甚至實行的是足夠的,但實際上它要比你想象的更復雜,而且往往需要更多的指令做同樣的工作。如果您需要將芯片的速度爲「可用」,那麼IMO它至少應該有一些共同的指令:

  • 1的條件跳轉指令:跳轉用於算法相等(或不等於)
  • 1 SUB指令。這種方式可以很容易地做到既加減沒有否定指令
  • 1按位的指令:NAND(或NOR),其中的這一個可以執行任何邏輯操作所需
  • 1 MOV指令
  • 1負載/存儲指令

使用子指令或按位指令可以執行移動數據,因此取決於您的體系結構和操作碼大小,您可以移除MOV或加載/存儲以使其更簡化。

+0

非常感謝!我會接受你的回答!但是我能再問你一個問題嗎?正如另一條評論所表明的那樣,最好有一個複雜的IL。但你同意嗎?或者你認爲最小化的IL對於優化更好? –

+0

對於IL來說,它往往很複雜,因爲它將被翻譯成機器代碼。相反,現在的機器指令集通常很簡單,這樣設計和使每條指令都更快。但是,如果性能很重要,那麼您只應該注意這一點,並且將商業產品的一部分性能與相同的成本/硬件匹配起來並不容易,因爲它需要大量的工作和研究,所以越簡單越好 –

2

我想你想要的是相反的。不要讓儘可能簡單的IL,你需要一個非常有表現力的IL。 IL越具有表現力,對特定架構進行優化就越容易。

將複雜的IL操作擴展爲許多單獨的指令比將許多簡單的IL操作合併成複雜指令更容易。您可能不需要乘以,因爲它可以通過跳轉和添加指令完成。但是當你編譯的芯片有一個硬件乘法時,你必須分析IL以確定這是一個「加法循環」並將其轉換回乘法。這比完成一次繁瑣的工作要多得多,並且說「嗯,這個架構不能這樣做,我想我們必須讓它成爲一個加法循環。」

另一個例子,你可能認爲你的IL不需要浮點運算,因爲有些ARM芯片必須在軟件中做浮點運算。但是一些ARM芯片不必這樣做,如果你的IL不支持FP操作,那麼你需要將複雜的軟件FP IL轉換回單個硬件指令。

最好將您的IL與最先進和最複雜的硬件功能進行匹配,然後在沒有它們的處理器上「回退」到那些功能的「軟件仿真」。

+1

有一個技巧可以讓你保持IL最小,同時能夠滿足目標特定功能(如FPU,SIMD等) - 內在功能。 –

+0

嗯感謝您的迴應!還有一件事:如果使用的指令集很少,那麼優化ILs會不會更容易? –

+1

@ChristianVeenman,一些指令並不那麼重要。更重要的是中間語言設計。某些屬性(如SSA)對優化非常有用。註冊機器比堆疊機器更容易優化(但後者更容易定位)。擁有明確的基本塊會使得所有的優化變得更容易,但同樣難以用這種方式生成代碼,也許你需要在其間使用另一種中間語言。內在研究更容易處理,但他們可以做出決定。將優化不透明(參見LLVM)。 –