浅谈MIPS地址对齐问题
1.什么叫地址對齊?
RISC 下使用訪存指令讀取或?qū)懭霐?shù)據(jù)單元時,目標地址必須是所訪問之數(shù)據(jù)單元字節(jié)數(shù)的整數(shù)倍,這個叫做地址對齊。
2.計算機主要的架構(gòu)分哪兩類?及其地址對齊在兩者的區(qū)別?
計算機主要的架構(gòu)就分為兩類,復(fù)雜指令集計算機(CISC)和精簡指令集計算機(RISC)。CISC最有代表性的架構(gòu)就是x86,RISC最有代表性的架構(gòu)就是ARM。不管是什么架構(gòu),對要訪問的一定長度的數(shù)據(jù)的地址是有要求的,比如要訪問一個32位的整數(shù),那么這個數(shù)據(jù)必須(最好)存儲在以4字節(jié)(32/8=4)對齊的地方。一般來說,RISC對對齊要求的更嚴格些,非對齊訪問可能會帶來性能上的損失。這對程序在不同架構(gòu)間移植非常重要,因為它極有可能導(dǎo)致你的程序崩潰。
從理論上講似乎對任何類型的變量的訪問可以從任何地址開始,但實際情況是在訪問特定類型變量的時候經(jīng)常在特定的內(nèi)存地址訪問,各個硬件平臺對存儲空間的處理上有很大的不同。一些平臺對某些特定類型的數(shù)據(jù)只能從某些特定地址開始存取。
3.MIPS平臺的地址對齊。
在 MIPS 平臺上,lh 讀取一個半字時,存儲器的地址必須是 2 的整數(shù)倍; lw 讀取一個字時,存儲器的地址必須是 4的整數(shù)倍; sd 寫入一個雙字時,存儲器的地址必須是 8 的整數(shù)倍。倘若訪存時,目標地址不對齊,則會引起異常,典型的是系統(tǒng)提示“總線錯誤”后,直接殺死進程。
直接貼代碼:
1 int main(void){ 2 unsigned int i = 0x12345678;3 4 unsigned char *p = (unsigned char *)&i;5 *p = 0x00;6 unsigned short *p1 = (unsigned short *)(p+1);7 *p1 = 0x0000;8 9 return 0; 10 } ?最后兩句代碼,從奇數(shù)邊界去訪問unsigned short型變量,顯然不符合對齊的規(guī)定。在X86上,類似的操作只會影響效率;但在MIPS或者SPARC上可能導(dǎo)致error,因為它們要求必須字節(jié)對齊。轉(zhuǎn)載于:https://www.cnblogs.com/nx520zj/p/5653461.html
總結(jié)
以上是生活随笔為你收集整理的浅谈MIPS地址对齐问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 老黄急了?游戏业务大跌44% NVIDI
- 下一篇: [ActionScript 3.0] N