關於IA64平台上的另乙個誤用

2021-10-25 03:18:42 字數 744 閱讀 7375

在之前的文章中,我說過ia64架構是乙個十分熱門的處理器架構(本文寫於2023年)。那,今天我們就再來講講在ia64上容易出現的另乙個誤用。這個誤用會生動地講述:如果你欺騙了編譯器,它會回過頭來狠狠地咬上你一口。

在ia64處理器上,沒有乙個所謂的」絕對定址」模式,而是通過r1暫存器來訪問全域性變數,這個暫存器還有另外乙個別名」gp」(global pointer)。它始終指向程式中的全域性變數,舉個例子:如果你定義了三個全域性變數,則第乙個可以通過[gp + 0]來訪問,第二個則是[gp + 8],以此類推,第三個是[gp + 16]。(我相信,win32 mips上的呼叫約定也是使用這個技術)

在ia64架構上,」addl」指令有乙個使用限制,也即:你只能使用最多22位,換句話說,就是4mb。所以你只能擁有4mb的全域性變數。

和你所想的一樣,有些開發者希望能使用多於4mb的全域性變數。幸運的是,這些人沒有定義100萬個dword變數,而是使用了一些特別大型的全域性陣列。

ia64處理器通過將全域性變數分為兩類來解決這個問題,將它們分為」small」和」large」這兩類。(small和large之間使用乙個編譯器標誌來進行區分。我相信編譯器預設將大於8個位元組的變數視作large)

下面的**演示了如何訪問乙個」small」變數:

在上面的**中,gp暫存器實際上是指向了變數位址的中間,所以可以同時使用正向和負向偏移來訪問。在這個例子中

關於世界上的另乙個自己

我知道,人有三次成長。第一次成長是在發現自己不是世界中心的時候 第二次成長是發現有的事,無論怎麼努力,依然無法改變結局,自己無能為力的時候。第三次成長,是已經知道事情結局難以改變,但你依然願意為之努力。如今,當三次成長都經歷了之後,我又在想,關於世界上的另乙個自己。我想的這個自己不是平行時空裡的另乙...

關於相容值的另乙個注釋

關於相容值的另乙個注釋。必須記錄相容屬性中使用的任何字串,以表明其所指示的內容。在documentation devicetree bindings中新增相容字串的文件。同樣在arm上,對於每個machine desc,核心會檢視是否有任何dt compat列表條目出現在compatible屬性中。...

關於MFC將乙個窗體嵌入另乙個窗體的方法

將乙個窗體 子窗體 嵌入另乙個窗體 父窗體 也就是相當於把乙個窗體當成控制項,放入另乙個窗體中 現在用的比較多的方法是將子窗體的窗體屬性中的border設為none,style設為child,在父窗體類中實現就行 cpage m page new cpage m page create m page...