2016-08-19 118 views
1

最近我一直在研究編譯器的設計。我已經成功掌握瞭解析階段,但在理解代碼生成的工作方式方面遇到了一些麻煩。彙編代碼生成如何工作?

從我讀過的東西,似乎是在代碼生成階段3個主要步驟:

  • 指令選擇(貪婪平鋪)
  • 指令調度
  • 寄存器分配

現在,指令調度稍微超出了我目前所要做的,並且我認爲通過更多的學習和原型設計,我可以將我的思想包圍在圖形公司用於寄存器分配的loring算法。

什麼殘缺我是第一步,指令選擇。從我讀到的內容來看,目標機器語言中的每條指令都由一個圖塊表示;目標是找到匹配樹最大部分的指令(因此稱爲暱稱,貪婪的平鋪)。

我很困惑的事情是,當它們沒有實際上與語法樹1:1對應時,如何選擇指令?例如,基於累加器的體系結構(如Z80或MIP單指令體系結構)。在Z80上執行甚至16位整數運算可能需要使用累加器或影子寄存器。

還有一些說明只能用於某些寄存器,儘管它們是通用的。

我是否正確地承擔以下事項? a)瓦片可以由匹配語法樹模式的指令序列組成,而不僅僅是1:1匹配。 b)代碼生成器首先爲基於堆棧的體系結構(或具有無限臨時寄存器的體系結構)生成代碼,並在寄存器分配階段以必要的方式擴展和替換指令。

回答

2

a)瓦片可以發出任意數量的指令。舉例來說,如果你有一個像%x <- %y + %z指令,但目標機只有兩個地址指令,然後匹配牌可能會發出裝配順序(目標是第一個操作數)

mov %x, %y 
add %x, %z 

二)什麼樣的寄存器(或const,或mem引用)允許作爲指令的操作數由指令本身決定,因此指令選擇階段必須用符號寄存器名稱(僞寄存器)來表示。寄存器分配階段的確可以發出添加指令,例如當需要的類的寄存器不可用於分配時溢出/加載代碼。

檢查 Survey on Instruction Selection: an Extensive and Modern Literature Review