2012-10-21 30 views
0

我目前工作的一個C++編譯器在JS我Logisim CPU,現在有變量的一個問題:我在RAM來存儲數據定義的空間寫我自己的C++編譯器..停留在變量

/值,並且我已經定義了一個空間來存儲地址到數據空間。我有一個寄存器nx,指針指向最後一個變量,寄存器mx指向最後一個「數據存儲」RAM。但我不知道如何訪問它們,例如在這裏:

修改C++代碼:

int *pointer_test; 
int test; 
test = 123; 
pointer_test = &test; 
*pointer_test = 25; 

預彙編:

//Allocate new variable  <--- int *pointer_test; 
add nx, 1 
//Set the pointer pointing to zero 
sram nx, 0 


//Allocate another variable <--- int test; 
add nx, 1 
//Allocate new storage for the variable 
add mx, 1 

//Let the variable point to the data <--- test = 123; 
sram nx, mx 
sram mx, 123 

我現在該如何實現:

pointer_test = &test; 

我&測試的唯一價值,保存在nx中,因爲它是聲明的最後一個變量,但不是變量/指針的地址「pointer_測試」 ......

回答

4

你可能想編寫基於堆棧的組件,就像在過去20年所有其他C編譯器。這意味着RAM中有一個數據區域,稱爲堆棧,它是一個先進先出隊列,增長緩慢。堆棧總是至少包含一個寄存器:堆棧指針。堆棧指針指向堆棧中當前位置的下一個地方。所以,要添加一些東西到堆棧中,你把它放在堆棧指針指向的地方,然後從堆棧指針中減去那個東西的大小。

是最經常使用在附帶選自C組件的另一個寄存器是基址指針。基指針指向當前幀的開始處。幀可以被粗略地與在C.因此,一個範圍,如果我有這樣的代碼:

int a; 
{ 
    int b; 
} 

和堆棧這是頂在0X9999,然後a將在0x9995(假設4字節INT)中,用堆棧指針現在指向0x9991,而基指針仍然在0x9999。當新的作用域被輸入時,基指針被移到堆棧指針,然後B被置於0x9991。然後,當範圍退出時,堆棧指針設置爲基本指針,從而有效地擦除較低範圍內的變量。

我從來沒有聽說過你編程的架構,但我們知道,任何兩個寄存器會做,但有些架構,像86,有具體的STAK寄存器(ebpesp在32位和rebrsp在64位上)。

但是,爲了回答這個問題多一點,它是編譯器的工作,知道到堆棧中的每個變量是什麼偏移,所以它可以做這樣的事情(僞):

base_pointer - 5 (Offset for pointer_test) = base_pointer - 4 (offset for test) 
+0

我認爲平時堆從0開始增加,它提供了一個簡單的方法來檢查它是否爲空而不知道它的大小。 –

+0

@ J.N。堆棧可能在任何地方開始,因爲進程中的多個線程將擁有自己的堆棧,並且它們都不能從地址0開始,這個地址很可能不會在進程地址空間中。但是,如果堆棧數據結構與索引一起使用,則通常會以索引值0開始,以指示它爲空。 –

+0

@Linuxios 對不起,我正在給JN寫信。我認爲你的解釋相當不錯。 –