2011-03-03 64 views
5

我在URL https://cs.senecac.on.ca/~btp100/pages/content/compu.html閱讀有關C語言的一些文字記憶。在部分「分割」時,它表示: 「用於管理大量字節的尋址一個邏輯技術是分割分割區分的其他區域的存儲器的某些區域例如,在專用段操作系統存儲的節目信息。 「 enter image description here分割的C語言

我不太明白這一點。

舉例來說,如果我有以下程序:

#include <stdio.h> 
#include <stdlib.h> 

int main(int argc, char *argv[]) 
{ 
    int x = 4; 
    int y = 5; 
    printf("%d\n", x+y); 
    system("PAUSE"); 
    return 0; 
} 

那麼,什麼是存儲在段代碼,什麼段數據,並在協議棧是什麼?請。

非常感謝

+4

你確定你需要知道嗎?對於16位操作系統來說,細分市場在25年前是非常重要的,但今天完全不相關。 – 2011-03-03 01:27:03

+1

1+,不完全不相關,但肯定與16位系統的意義不相關。 – 0xC0000022L 2011-03-03 01:31:25

+1

順便說一句,這是作業,對不對?使用作業標籤。 – ThomasMcLeod 2011-03-03 01:32:10

回答

4

堆棧是本地變量(如x和y)。代碼段用於實際執行的二進制代碼。最後,數據段用於您的程序使用的值(例如,那裏的PAUSE字符串)。

+0

從「標準C」的意義上講,這在技術上並不正確。在一些(甚至大多數)平臺上可能是這樣,但是甚至不需要使用堆棧來實現。 – 2013-05-21 22:52:29

+0

@RandyHoward:你是對的,但我根據問題的深度來判斷我的答案的深度。我讓你的投票和評論支持或糾正我的一般答案。 – 2013-05-22 18:21:13

2

這是編譯器的依賴。但在一般情況下,假設你有一個實際使用segmenation的OS,你的局部變量xy都參考SS,你的字符串文字「%d \ n」和「暫停」被引用到DS和您的實際彙編代碼爲基準到CS。

0

這個問題是系統特定的。例如,段描述符也用於32位Windows上,但用於其他目的而不是傳統上在16位系統中,其中一個需要分割以同時引用不同區域的存儲器。

使用32位寬指針類型時,32位系統可以尋址完整的虛擬地址空間,這就是爲什麼Windows中的fs擁有特殊結構(如TEB和PEB)的關鍵。然而,從嚴格意義上講,平面存儲器模型不需要段寄存器。

實例(Windows專用,32位):

mov eax, dword ptr fs:[18h] ; pointer to TEB 
mov eax, dword ptr fs:[30h] ; pointer to PEB 

在許多現代系統csds將指向同一個區域,例如。