1. 程式人生 > >微控制器儲存中的大小端模式

微控制器儲存中的大小端模式

請寫一個C函式,若處理器是Big_endian的,則返回0;若是Little_endian的,則返回1

解答

int checkCPU( )
{
    {
           union w
           { 
                  int a;
                  char b;
           } c;
           c.a = 1;
           return(c.b ==1);
    }
}

剖析
嵌入式系統開發者應該對Little-endianBig-endian模式非常瞭解。採用Little-endian

模式的CPU對運算元的存放方式是從低位元組到高位元組,而Big-endian模式對運算元的存放方式是從高位元組到低位元組。例如,16bit寬的數0x1234在Little-endian模式CPU記憶體中的存放方式(假設從地址0x4000開始存放)為:

記憶體地址 0x4000 0x4001
存放內容 0x34 0x12

而在Big-endian模式CPU記憶體中的存放方式則為:

記憶體地址 0x4000 0x4001
存放內容 0x12 0x34

32bit寬的數0x12345678在Little-endian模式CPU記憶體中的存放方式(假設從地址0x4000開始存放)為:

記憶體地址 0x4000 0x4001 0x4002 0x4003
存放內容 0x78 0x56 0x34 0x12

而在Big-endian模式CPU記憶體中的存放方式則為:

記憶體地址 0x4000 0x4001 0x4002 0x4003
存放內容 0x12 0x34 0x56 0x78

聯合體union的存放順序是所有成員都從低地址開始存放,面試者的解答利用該特性,輕鬆地獲得了CPU對記憶體採用Little-endian還是Big-endian模式讀寫。如果誰能當場給出這個解答,那簡直就是一個天才的程式設計師。
補充:
所謂的大端模式

,是指資料的低位(就是權值較小的後面那幾位)儲存在記憶體的高地址中,而資料的高位,儲存在記憶體的低地址中,這樣的儲存模式有點兒類似於把資料當作字串順序處理:地址由小向大增加,而資料從高位往低位放; 所謂的小端模式,是指資料的低位儲存在記憶體的低地址中,而數 據的高位儲存在記憶體的高地址中,這種儲存模式將地址的高低和資料位權有效地結合起來,高地址部分權值高,低地址部分權值低,和我們的邏輯方法一致。
為什麼會有大小端模式之分呢?這是因為在計算機系統中,我們是以位元組為單位的,每個地址單元都對應著一個位元組,一個位元組為 8bit。但是在C語言中除了8bit的char之外,還有16bit的short型,32bit的long型(要看具體的編譯器),另外,對於位數大於 8位的處理器,例如16位或者32位的處理器,由於暫存器寬度大於一個位元組,那麼必然存在著一個如果將多個位元組安排的問題。因此就導致了大端儲存模式和小 端儲存模式。例如一個16bit的short型x,在記憶體中的地址為0x0010,x的值為0x1122,那麼0x11為高位元組,0x22為低位元組。對於 大端模式,就將0x11放在低地址中,即0x0010中,0x22放在高地址中,即0x0011中。小端模式,剛好相反。我們常用的X86結構是小端模 式,而KEIL C51則為大端模式。很多的ARM,DSP都為小端模式。有些ARM處理器還可以由硬體來選擇是大端模式還是小端模式。