2014-04-26 49 views
2

我正在研究ARM指令體系結構,並且我已經知道指令是以字對齊的方式存儲的,所以指令地址的最低有效位在ARM狀態下始終爲零。爲什麼不使用32位ARM指令地址的2個LSB

Thumb和Thumb-2指令長16或32位。指令存儲爲半字對齊,所以指令地址的最低有效位在Thumb狀態下始終爲零。

在我對AVR等不同微控制器的一些研究中,在訪問程序存儲器時,我使用最低有效位來區分要訪問的高字節或低字節。但那是關於數據存儲器訪問的。

在ARM中,指令無論如何都是32位,因此應該一次提取所有字節。

然後爲什麼最後兩位需要讀取指令的一個特定字節(Thumb模式下爲1位)並使用了存儲區。 PS:如果我要獲取4字節長指令的單個字節,則需要4個週期,效率非常低,那麼具有字節尋址能力的目的是什麼?是因爲新的THUMB類型指令哪些是16位寬,但仍佔用32位空間?

+3

你不清楚你在尋求什麼解釋;你的前兩段是你的問題的答案! –

+0

爲什麼他們在ARM或THUMB模式下都有銀行存取32/16位指令的單個字節。一條指令應該作爲一個完整的詞取代嗎? – Haswell

+0

如果我要讀取4字節長指令的單個字節,則需要4個週期,效率非常低,因此具有字節尋址能力的目的是什麼?是因爲新的THUMB類型的指令是16位寬但仍佔用32位空間? – Haswell

回答

2

我想你再次將指令訪問與數據訪問混合在一起。就數據訪問而言,我們可能會使用最後兩位來獲取4字節數據中的任何字節。

但是不使用最後兩位的概念與訪問32位指令的單個字節無關。正如你所說,一次訪問一個字節的指令訪問效率非常低,不允許。所以爲了執行這條規則(不訪問指令訪問中奇數邊界的字節),最後兩位不會被考慮。下圖將解釋這樣的:

的地址是32位:

| --0x0000000 - | --0x0000000 - | --0x0000000 - | --0x0000000 - |

| --0x0000000 - | --0x0000000 - | --0x0000000 - | --0x0000000 - |

專注於最後nible:

| 3-00 ; 2-00 ; 1-00 ; 0-00 ; |

| 7-01 ; 6-01 ; 5-01 ; 4-01 ; |

現在關注最後兩個最低有效位。 我們的目標是不允許指令從1,2,3,5,6,7, 位置開始。因此,如果您檢查兩個LSB,它們不能是01,10,11中的任何東西。 只允許「00」作爲2個LSB。現在,因爲它們是00,所以當生成的地址是4的倍數時,它就像忽略它們一樣好。

希望你能更好地形象化。

2

在大拇指所有手臂指令都是32位,4個字節之前,並且讓它們指定它們必須對齊,使得指令地址的低兩位始終爲零。然後,拇指出現,16位指令,所以地址的低位始終爲零。他們增加了一個細微差別,當使用bx或blx切換模式時,lsbit用來區分拇指和手臂。如果lsbit在饋送到bx或blx時爲零,則它保持在或切換到手臂模式,如果1保持在或切換到拇指模式。請注意,lsbit在放置在使用的pc中時會從地址中刪除。在任一模式下運行時,pc lsbit始終爲零,手臂模式下的位1始終爲零。

arm總線通常是32位或64位寬,它不像x86等那樣是一個可變字設置,它現在與thumb2一樣,但並不完全相同。所以你不會提取單個字節,然後提取更多的字節來隔離指令。 (並非現代可變長度指令集效率低下)。所以一個arm可以在64位數據總線上一次獲取8個指令,這個時間是4個時鐘週期(一旦握手結束)。當然,這是緩存,緩存相同或不止於此。每個內核/體系結構的取數都不相同,內存控制器必須處理所有有效週期類型,從任何通道上的一個字節到總線寬度。

我不知道你的意思是銀行?作爲程序員,我們認爲基於字節的地址作爲一個字節是我們最小的可尋址項目。當你到達實際的rams硬件時,人們開始剝離他們沒有使用的地址位,所以他們的lsbit可能與我們的不同。當你寫一個單字節時,一些處理器總線不會把整個字節地址放在總線上,它們只能在總線上放置字或雙字地址(2或3個零位),然後用一個字節掩碼來告訴哪個字節通道包含新數據以及您必須在目標上保留哪些字節通道。

amba/axi總線週期在武器網站infocenter.arm.com的amba/axi總線文檔中進行了描述,詳細描述了每個事務的工作原理。一點也不復雜......

+0

從你的標題,這些低位是肯定不會被忽略,如果你試圖弄亂那些你會下注預取中止或其他問題的位。 –

0

請注意,問題標題僅適用於幾個特定體系結構版本(ARMv3和ARMv4,在32位模式下) - 從ARMv4T開始,分支地址的LSB用於ARM/Thumb交互操作,如@dwelch已經注意到。在v6M和v7M上嘗試切換指令集是而不是被忽略,並導致故障。

在v3之前,當地址空間只有26位,並且沒有專用的CPSR時,r15的最低兩位用於存儲處理器模式(標記位於最高6位) - 標誌設置寫入r15會更新PC和PSR位。

相關問題