1. 程式人生 > >大小端模式和處理器

大小端模式和處理器

一、一段歷史
端模式(Endian)的這個詞出自Jonathan Swift書寫的《格列佛遊記》。這本書根據將雞蛋敲開的方法不同將所有的人分為兩類,從圓頭開始將雞蛋敲開的人被歸為Big Endian,從尖頭開始將雞蛋敲開的人被歸為Littile Endian。小人國的內戰就源於吃雞蛋時是究竟從大頭(Big-Endian)敲開還是從小頭(Little-Endian)敲開。在計算機業Big Endian和Little Endian也幾乎引起一場戰爭。在計算機業界,Endian表示資料在儲存器中的存放順序。
PowerPC處理器主導網路市場,可以說絕大多數的通訊裝置都使用PowerPC處理器進行協議處理和其他控制資訊的處理,這也可能也是在網路上的絕大多數協議都採用大端編址方式的原因。因此在有關網路協議的軟體設計中,使用小端方式的處理器需要在軟體中處理端模式的轉變。而Pentium主導個人機市場,因此多數用於個人機的外設都採用小端模式,包括一些在網路裝置中使用的PCI匯流排,Flash等裝置,這也要求硬體工程師在硬體設計中注意端模式的轉換。


二、使用大小端的處理器
常用的X86結構是小端模 式,而C51微控制器則為大端模式(8位的51沒有大小端之說,但Keil C51編譯器是大端的)。很多的ARM,DSP都為小端模式。有些ARM處理器還可以由硬體來選擇是大端模式還是小端模式。SPARC處理器為大端處理器。
採用大端方式進行資料存放符合人類的正常思維,而採用小端方式進行資料存放利於計算機處理。到目前為止,採用大端或者小端進行資料存放,其孰優孰劣也沒有定論。因此在一個處理器系統中,有可能存在大端和小端模式同時存在的現象。這一現象為系統的軟硬體設計帶來了不小的麻煩,這要求系統設計工程師,必須深入理解大端和小端模式的差別。大端與小端模式的差別體現在一個處理器的暫存器,指令集,系統匯流排等各個層次中。


三、大端小端轉換方法:
Big-Endian轉換成Little-Endian如下:
#define BigtoLittle16(A) ((((uint16)(A) & 0xff00) >> 8) |
(((uint16)(A) & 0x00ff) << 8))
#define BigtoLittle32(A) ((((uint32)(A) & 0xff000000) >> 24) |
(((uint32)(A) & 0x00ff0000) >> 8) |
(((uint32)(A) & 0x0000ff00) << 8) |
(((uint32)(A) & 0x000000ff) << 24))


四、大端小端檢測方法:
如何檢查處理器是big-endian還是little-endian?
聯合體uniON的存放順序是所有成員都從低地址開始存放,利用該特性就可以輕鬆地獲得了CPU對記憶體採用Little-endian還是Big-endian模式讀寫。
int checkCPUendian()
{
union
{
unsigned int a;
unsigned char b;
}c;
c.a = 1;
return (c.b == 1);
}
/*return 1 : little-endian, return 0:big-endian*/


參考:
http://blog.csdn.net/wkhd2008/article/details/6543269