LEGv8指令集中分支和跳转的地址范围
小測驗:
1.LEGv8中條件分支的地址范圍多大(K=1024)?
答案: 分支前后大約1024K(即1M)的地址范圍
2.LEGv8中跳轉和跳轉鏈接指令的地址范圍(M=1024K)是多大?
答案:分支前后大約128M的地址范圍
請讀者自行計算一下以上兩道題目,并且請帶著這兩個問題閱讀下面的文字。
下面是正文。
LEGv8跳轉指令(無條件分支指令)采用最簡單的尋址方式,使用B型LEGv8指令格式,操作碼為6位,其余為都是地址段。
B 10000 // go to location 10000(Decimal)可以匯編成下面的格式(實際中更為復雜):
| 6位 | 26位 |
其中,跳轉指令的操作碼值為5,分支地址為10000ten10000_{ten}10000ten?。
和跳轉指令不同,條件分支指令除了分支地址之外還可以指定一個操作數。
因此:
被匯編成下面的指令,其中只有19位用于指定分支地址:
| 8位 | 19位 | 5位 |
對于條件分支指令,這種格式叫作CB型。
如果程序的地址只能放在19位的字段中,這意味著沒有程序能大于2192^{19}219,這在今天來說實在太小,因此是一種很不現實的選擇。
另一種方法是指定一個寄存器,該寄存器的值用于和分支地址的偏移量相加以得到最終地址,這樣分支指令的地址可按下面的方式計算:
程序計數器=寄存器內容+分支地址偏移量程序計數器=寄存器內容+分支地址偏移量程序計數器=寄存器內容+分支地址偏移量
這個求和結果允許程序的大小得到2642^{64}264,并且仍能使用條件分支,從而解決了分支地址大小的問題。但隨之而來的問題是,使用哪個寄存器?
答案取決于條件分支是如何使用的。 條件分支在循環和if語句中都可以找到,它們傾向于轉向附近的指令。例如,在SPEC基準測試程序中,大概一半的條件分支轉移范圍都在16條指令以內。因為程序計數器(PC)包含當前指令的地址,所以如果我們使用PC作為計算地址的寄存器,就可轉移到距當前指令±218±2^{18}±218個字(1個字=32位)的地方。 幾乎所有的循環和if語句都遠遠小于±218±2^{18}±218個字,因此PC是一個理想的選擇。這種分支地址的尋址方式稱為PC相對尋址(PC-relative addressing).
PC相對尋址:一種尋址方式,將PC和指令中的常數相加作為地址。
像近期大多數計算機一樣,LEGv8對所有條件分支使用PC相對尋址,因為這些指令的跳轉目標一般都比較接近分支指令本身。 另一方面,分支和鏈接(branch-and-link)指令引發的過程則并不一定總是靠近調用者,所以通常使用其他尋址方式。 因此,LEGv8 體系結構通過對分支指令以及分支和鏈接指令采用B型指令格式,為過程調用提供長地址。
因為LEGv8的所有指令都是4字節長,所以將PC相對尋址的地址設計成字地址(1個字=32位)而不是字節地址,從而可以擴展分支轉移的范圍。 通過將字段解釋成相對字地址而不是相對字節地址,19位的地址字段所指示的轉移范圍擴大了4倍:當前PC±1MB。同樣,分支指令的26位字段 也是字地址,即表示28位字節地址。
這里的1MB是怎么算出來的呢? 19位地址提供2182^{18}218種尋址方式,又因為是字地址,還需要乘以4倍(即222^222)所以 尋址大小為218×22=220=1MB2^{18}\times 2^2=2^{20} =1MB218×22=220=1MB
無條件分支(即跳轉指令)也采用PC相對尋址,這意味著轉移范圍是當前PC值±128MB。
這里的128MB是怎么算出來的呢? 26位地址提供2252^{25}225種尋址方式,又因為是字地址,還需要乘以4倍(即222^222)所以 尋址大小為225×22=227=220×27=128MB2^{25}\times 2^2=2^{27}=2^{20} \times 2^7 =128MB225×22=227=220×27=128MB
閱讀《計算機組成與設計(ARM版)》的讀書筆記。
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的LEGv8指令集中分支和跳转的地址范围的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 要你命3000-List29
- 下一篇: 在租房过程中,如何应对房东的不合理要求?