微控制器儲存中的大小端模式
阿新 • • 發佈:2019-01-24
請寫一個C函式,若處理器是Big_endian的,則返回0;若是Little_endian的,則返回1
解答:
int checkCPU( )
{
{
union w
{
int a;
char b;
} c;
c.a = 1;
return(c.b ==1);
}
}
剖析:
嵌入式系統開發者應該對Little-endian和Big-endian模式非常瞭解。採用Little-endian
記憶體地址 | 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處理器還可以由硬體來選擇是大端模式還是小端模式。