2012-09-18 120 views
11

我完全理解32位或64位系統的含義。所以基本上所有的寄存器或字長都是32或64位。CPU如何在32位內存和32位處理器中訪問單字節內存

爲了簡單起見,讓我們拿一個32位的系統,並說我用C編寫了一個程序,如果我聲明一個int類型的話說「int a = 5;」那麼一個字長的存儲位置被保留給var a。所以當我想訪問它時,我可以使用該地址的字地址。

但是說我有4個字符「char a,b,c,d;」因爲它是一個字節,每個都放在一個字中,所以如果我只想訪問char b?(說內存是字節可尋址的)現在說b是這個字中的第三個字節,我該怎麼辦......那麼它是如何來到公共汽車的?是不是第三個字節在總線上連接到第17到第24行?所以當只有b被訪問時,其他24行會發生什麼?

+0

檢查特定CPU的機器語言,彙編語言,尤其是有關內存尋址和CPU寄存器的部分。 – theglauber

+1

@deepak,在支持字節尋址的32位平臺上,可以在寫入其他三個字節(根據字節使能信號關閉)的情況下將一個字節寫入存儲器。 –

+0

@EricZ,現在如果我想要的字節是內存中的第二個字節(從零開始計數)會發生什麼?通常當我從內存中訪問一個字時,第二個字節在寄存器的第23 - 16位之間出現。但是在這種情況下,它必須在位置7-0處着陸。這使我感到困惑,因爲我認爲存儲器的第0位連接到寄存器的第0位,第31位連接到第31位。我認爲這是全部在電路中,所以在字節訪問期間,應該如何在位位置16處着陸,位於位置0? – deepak

回答

3

您的問題的答案很大程度上取決於您使用的編譯器以及CPU,內存控制器和內存體系結構(高速緩存和外部內存)的內部工作方式。
您只能控制編譯器(假設您使用的是C或C++編譯器)。當您使用小於字長的變量時,編譯器具有不同的模式。有用於速度優化和內存優化的標誌。根據哪些標誌打開,編譯器可能會選擇生成將所有四個變量(在您的情況下)打包爲一個字的代碼。或者編譯器可能會選擇爲每個變量分配一個內存字,但使用特定的字節來存儲實際值。編譯器爲每種情況執行的方式是爲CPU生成不同的指令集。在後一種情況下,如果從存儲器中讀取變量,則整個字被放在總線上,然後放到通用寄存器中。在前一種情況下,該字被放入寄存器,但該字可以逐位移位,其他位可以通過使用邏輯與運算來清零。這樣正確的字節將在寄存器中。或者可能是CPU體系結構支持字中的字節級訪問,在這種情況下,它將只是CPU執行的一個操作。最後,理解內部會發生什麼是一個不錯的主意,但是你不會太在意,因爲編譯器生成的指令集從你的角度來看是正確的。你唯一需要關心的是編寫性能敏感的軟件。在這種情況下,您需要知道CPU和內存的細節以及編譯器支持的標誌。

3

這取決於彙編程序,它可能會選擇給一個字的內存或一個字節。
所以現在即使你在這個詞中有4個不同的字符,會發生什麼事情都是一次被訪問,但只有你需要的那個被操作。即它們全部從內存進入處理器,然後只考慮你想要的字節,其他的則被拒絕。

相關問題