2009-11-12 133 views
1

假設在一個程序中我們已經實現了一個堆棧。但是誰創造了這個堆棧?它是處理器,操作系統還是編譯器?什麼創建堆棧?

+0

http://stackoverflow.com/questions/1612982/how-一點Win32彙編編程這並不直接回答你的問題,但它可能會爲你清楚一些事情,關於計算機如何工作。請閱讀這個問題,以及第二個投票答案(我寫的)。 – 2009-11-12 13:53:17

+0

你的意思是執行堆棧的地址和局部變量的存儲位置?這是由操作系統創建的。在Linux上,execve()爲堆棧分配內存,而fork()也從父堆棧中複製內容。 – stribika 2009-11-12 13:54:36

+4

堆疊精靈。他們住在北橋下。 – Crashworks 2009-11-12 21:12:48

回答

4

如果您的意思是數據結構:處理器執行代碼。代碼調用操作系統來獲取堆棧的內存,然後將其操作以形成堆棧。編譯器只是將您編寫的代碼轉換爲處理器可以理解的代碼。

如果您指的是執行堆棧:操作系統負責將進程加載到內存中並設置其內存空間以形成堆棧。

+1

真的沒有「堆疊」這樣的東西,一切都只是記憶! (不是現在談論數據結構棧的實現..)嘿。 – 2009-11-12 13:45:45

+7

如果在沒有揚聲器連接到計算機時堆棧傾倒,是否發出聲音? – Rich 2009-11-12 13:54:45

+4

確實有這樣的東西作爲一個堆棧。堆棧是一塊充當後進先出緩衝區的內存。是的,這是記憶,但是具有特定目的的記憶。 – semaj 2009-11-12 16:13:37

6

您是否將程序執行堆棧與堆棧容器混淆?

你不能「執行」執行堆棧,操作系統會給你虛擬地址空間並在那裏找到你的堆棧指針,所以你只需按下並彈出它,你不會「創建它」,它在那裏你幾時開始。

+5

你應該真的做出這個評論! – 2009-11-12 13:45:01

1

您的程序...它執行所需的程序集。編譯器根據所使用的calling convention代替該函數/函數調用插入該程序集。

瞭解調用約定可能是最有效的方法來回答你的問題。

0

堆棧是後進先出(LIFO)列表數據結構。程序執行時會根據程序執行要求將變量存儲,刪除。

0

如果您想實現自己的堆棧,請嘗試使用std :: stack <>。如果您正在討論本地變量所在的堆棧,那是由C++運行時系統創建的。

1

以上都不是。你在實現它時創建了它。編譯器只會將您的想法(用編程語言表達)轉換爲機器代碼或彙編代碼。處理器只運行您編寫的程序。操作系統(假設存在)提供了一些機制來幫助給你一個執行空間和內存來完成它,但你的程序決定了執行空間和內存中會發生什麼。

0

「假設在一個程序中我們已經實現了一個堆棧。」

然後,您在底層的低層數據結構(如數組)上實現它。您的堆棧=數組+函數(push(),pop())在數組上工作以提供堆棧功能。

「但是誰創建堆棧?它是處理器,操作系統還是編譯器?」

誰創建函數和數組?函數是由你創建的,然後編譯器將函數轉換爲機器指令並保持這些代碼可執行。另外,它會產生一組指令,爲陣列分配內存空間。所以你的程序是一個數組的指令和空間的混合。然後操作系統加載您的程序並將指令發送到處理器。處理器執行此指令並讀取/寫入數據到您的陣列。

0

假設你有一個測試C程序:

 
int square(int val) { 
    int result; 

    result = val * val; 
    return(result); 
} 

int main(void) { 
    int store; 

    store = square(3); 
    return(0); 
} 

然後你就可以生產使用命令
gcc -S test.c -o test.s
(如果你是一個Linux平臺上)編譯器生成彙編輸出。

縱觀生成的代碼只是square()功能,我們得到:

 
square: 
     pushl %ebp 
     movl %esp, %ebp 
     subl $16, %esp 
     movl 8(%ebp), %eax 
     imull 8(%ebp), %eax 
     movl %eax, -4(%ebp) 
     movl -4(%ebp), %eax 
     leave 
     ret 

你可以看到,編譯器生成的代碼來移動堆棧指針在例行的局部變量。

程序的初始化代碼將通過調用系統(操作系統)內存分配函數爲「堆棧」分配一定量的內存。然後由編譯的程序決定如何利用該區域的內存。

幸運的是,所有這些都由編譯器有效地處理,而不必考慮它(當然,除非標準堆棧大小的本地變量太大,在這種情況下您可能必須指示您的編譯器或線程庫從系統分配更多堆棧)。

0

假設在程序中我們已經實現了一個堆棧。但是誰創造了這個堆棧?

那麼如果你實現了它,那麼按照定義你創建它。你需要更具體的w.r.t.上下文。

0

標準運行時庫或鏈接器加載器創建堆棧。它是在你的main之前運行的一段代碼中完成的。鏈接器會自動插入此代碼,並在運行時運行,在調用main之前設置各種事情,例如任何靜態初始化的全局變量。它通常也設置堆棧,儘管一些操作系統將其放入操作系統代碼(鏈接器加載器),因爲他們想要在其系統上標準化堆棧實現/形狀。

0

堆棧被嵌入處理器,它是ESP寄存器,你需要學習,以understad堆棧