2014-09-05 94 views
0

我正在通過Jack Crenshaw的「Let's Build A Compiler」。我正在將他的Motorola 680x0指令翻譯成x86 GAS語法。GAS組件中的變量賦值

在變量賦值期間,所需的語義是通過使用PC相對尋址(至少這就是Crenshaw所要做的)創建一個變量的引用。該變量可以在由摩托羅拉語法來訪問:

MOVE X(PC),D0

其中x是變量名。

下面是實際的過程是什麼樣的分配(以帕斯卡):

procedure Assignment; 
var Name: char; 
begin 
    Name := GetName; 
    Match('='); 
    Expression; 
    EmitLn('LEA ' + Name + '(PC),A0'); 
    EmitLn('MOVE D0,(A0)') 
end; 

試圖模仿氣體裝置結果相同的語法在垃圾表達錯誤。希望這個問題不是太天真,但我一直在尋找幾天,並沒有看到明顯的解決方案。

如何在Linux(i386)上用x86處理器的GAS語法完成此操作?我正在尋找最簡單的方法來完成變量賦值。我爲我的彙編器和編譯器分別使用了asld

下面是我在哪裏目前,第3章中的鏈接克倫肖:

http://compilers.iecc.com/crenshaw/tutor3.txt

+1

你需要它使用PC相對尋址?如果沒有,它看起來像一個'movl%eax,'+ Name'會做(沒有讀過Crenshaw的書)。 – Michael 2014-09-05 13:28:53

回答

3

X86-32沒有PC相對尋址,但X86-64一樣。 在任何情況下,在x86上您都不需要通過寄存器,您可以直接在MOV中使用符號。因此,最簡單的寫法是:MOV source_register, variable_name。 如果你想更接近地模仿原代碼,你可以使用LEA這樣的:

LEA variable-name, temp_register 
MOV source_register, (temp_register) 
+0

我認爲這種方法要求首先聲明該變量。似乎Crenshaw沒有聲明任何東西。對不起,我忘了在原始問題中提到這一點。 – 2014-09-05 20:34:53

+0

它不必首先聲明*,但它確實需要最終在某個地方定義,並具有存儲分配。 – Jester 2014-09-05 21:22:58

+0

其實,這很有幫助,聲明可以內聯,還是需要在.data或.bss部分? – 2014-09-05 22:53:20