ARM基礎(chǔ):ARM知識通俗理解
/******************************************************************************************************************
參考:
說明:。
******************************************************************************************************************/
記一下概念的東西,有我自己的認(rèn)識:
關(guān)于ARM THUMB兩個狀態(tài),我自己的見解就是就像現(xiàn)在的電腦,新買的CPU都是64位的,但是也可以裝成32位的系統(tǒng)xp或win7,這就是CPU工作的32位狀態(tài)。而如果裝了64位的win7那CPU就工作在64位了,那么是ARM狀態(tài)就對應(yīng)上邊例子中的64位的,THUMB對應(yīng)32位的,這應(yīng)該是一個過度。我問過u-boot Linux都是一直工作在ARM狀態(tài),一直都沒有一點(diǎn)THUMB狀態(tài),對于那種剛開始學(xué)這個,沒做過項(xiàng)目的老師們一再講這個就現(xiàn)在想想沒有多大的意義了。對于PC機(jī)來說現(xiàn)在是32位到64位的過渡,但是對于已經(jīng)是后32位的時代的,還要講16的東西,就該往前看看多說說64位的事了。
關(guān)于匯編學(xué)習(xí)的程序,先說它在哪里用到了吧。在u-boot 或者Linux的起始時用的是匯編,至于為什么這樣,可以想想飛機(jī)的原理,飛機(jī)就是要擺脫輪子的慢,但是在飛機(jī)的起飛階段,飛機(jī)還是要用輪子的。這是為什么,因?yàn)檩喿涌梢杂兴膬?yōu)點(diǎn)。就想上邊兩種情況要用匯編一樣,這樣作用就明了了。真正造車的才會深入了解輪子的各種信息(這種就是指芯片公司的AP工程師)。嵌入式學(xué)習(xí)者就像說相聲的各個方面都要學(xué)習(xí),京劇,二人轉(zhuǎn)。不過那都叫學(xué)唱,同樣道理對于嵌入式學(xué)習(xí)者來說,匯編的作用也就是這了。
關(guān)于匯編中的標(biāo)號就是一個內(nèi)存地址的別名:
如下圖的START其實(shí)就是30000000,但是你在跳轉(zhuǎn)的時候還是記憶START是更容易的。
關(guān)于DCD和SPACE:
StackUsrDCDUsrStackSpace
AREAMyStacks,DATA,NOINIT,ALIGN=2
UsrStackSpaceSPACEUSR_STACK_LEGTH*4
以上代碼等價于C語言中的:
int*p=malloc(USR_STACK_LEGTH*4)
我個人認(rèn)為匯編因?yàn)橹胁荒軐⑦@樣寫,所以就找了UsrStackSpace來作中間量,它只是打醬油的,沒有在歷史上起到重要作用。
StackUsrDCDSPACEUSR_STACK_LEGTH*4
也可以這么說,如果代碼僅有上邊的,那么:StackUsr DCD UsrStackSpace會顯得多余了,因?yàn)楹谜涂梢钥闯鲋苯又蠻srStackSpace就可以了。
但是由于UsrStackSpace代表這一塊內(nèi)存的首地址了,我要是以后經(jīng)常訪問尾地址了怎么辦,再來一個玩意來存著尾地址。就用StackUsr了。讓StackUsr干活還要把它伺候好了,它本身也要占個位置,這就用到了DCD了,DCD給StackUsr找個位置,然后就開始給它任務(wù)了。如果把UsrStackSpace交給它,那么StackUsr和UsrStackSpace就一個樣了;如果把UsrStackSpace+(USR_STACK_LEGTH-1)*4給它,那么StackUsr指向了這個塊的末地址。至于誰會這要求,那就是堆棧了!
關(guān)于堆棧,就是棧。我有我的看法,這就好比一個好師傅在拆一個錄音機(jī),螺絲大小不一。那么拆的時候一般會將它們按照順序放著,這么做的目的就是為了一會兒修好了之后再裝的時候能一個一個對應(yīng)著裝上去。慢慢引入解釋就是說這個師傅把拆下的螺絲都放到了棧中,就是一個司空見慣的一個東西起了一個新名。師傅是靠各個螺絲的物理位置不同來安裝的,但是對于計算機(jī)來說它是“平面”的,只有先后順序沒有物理位置,只能靠拆下每個螺絲的順序來區(qū)別了,相當(dāng)于畫一個表,有123..順序,然后將螺絲一一放入對應(yīng)位置,裝的時候就反序一個裝上去。這樣就不會有錯了。說這么一大堆就是一個怕搞錯了。
計算機(jī)什么時候這樣做呢,就是用C語言編程在調(diào)用子函數(shù)時候,這個時候就相當(dāng)于這個師傅要拆錄音機(jī)了。子函數(shù)調(diào)用完后,就要回來繼續(xù)運(yùn)行主函數(shù),這個時候就相當(dāng)于師傅要裝上錄音機(jī)了。這時候就要看看在調(diào)用子函數(shù)時有沒有做好善后工作了,有沒有把主函數(shù)的狀態(tài)保存下來,回來的時候好還原出來當(dāng)初的狀態(tài)。放狀態(tài)的容器就是“?!?,為也還原時不出錯,要狀態(tài)所涉及的所有東西一一按照順序放到這個容器里,到時候還原的時候再按時一定的順序取出來,如果兩個順序都定死了,以后就不會出錯了。關(guān)于制定這兩個順序大家想到了,規(guī)定一個這個容器只有一個口.....(關(guān)于這個順序暫時還沒有想到通俗的例子)