1. 程式人生 > >大小端模式,內存地址高低位,寄存器高低位

大小端模式,內存地址高低位,寄存器高低位

.net ims family 個數 32位 指數 這樣的 空格 sun

原文鏈接:https://blog.csdn.net/Andyzzhz/article/details/40405451

CPU:大小端模式的區別:
大端模式(Big-endian),是指數據的低位(就是權值較小的後面那幾位)保存在內存的高地址中,而數據的高位,保存在內存的低地址中,這樣的存儲模式有點兒類似於把數據當作字符串順序處理:地址由小向大增加,而數據從高位往低位放;
小端模式(Little-endian),是指數據的低位保存在內存的低地址中,而數據的高位保存在內存的高地址中,這種存儲模式將地址的高低和數據位權有效地結合起來,高地址部分權值高,低地址部分權值低,和我們的邏輯方法一致。

內存地址高地的理解:
我們對內存表的高位和低位的理解,就可以想做這裏就是一張白紙. 我們把每個空格都當作一個位置,從0~1000開始計數,寫在最前的就是低位,
比如說寫四個數,從0~3 . GAME數據的低位~高位就是從G到M.
寄存器高位低位的理解:
之後呢,我們從內存表中區數據,放入寄存器中,我們可以把寄存器比做一個水桶,我們放入數據的時候肯定是把"水"先倒到水筒的底部.
如我們從內存中區GAME放入到水桶中的話 水桶中存放的數據就成了EMAG 也就是 45 4D 41 47 (註意每個字節是兩個16進制的字符)
而水桶的高位和地位呢,想必大家會很明白,水桶的最上方就是高位,水桶底就是低位,所以EMAG 數據的高低位就是 E~G(E為最高位 G為最低位)
嵌入式系統開發者應該對Little-endian和Big-endian模式非常了解。
我們常用的X86結構是小端模 式,而KEIL C51則為大端模式。很多的ARM,DSP都為小端模式

舉例:

假設有一塊內存,物理地址從1000-2000,現在要存一個數據1234H.(字型數據,占16位,兩個字節,兩個儲存單元)

內存的儲存單元是字節,一個字節最大存10進制數255,16進制數FF.

在這裏,低地址單元(1000)存入34,高地址單元(1001)存12.讀取的時候就從高地址到低地址讀取:1234H.

如果還要存12H(byte字節數據)那麽就是,1002裏面放入12h

此時內存排列是34 12 12.

如果還要存一個數據12345678h(dword數據32位)

那麽就是 78 56 34 12.

總的內存排列就是 34 12 12 78 56 34 12.(每個字節作為一個儲存單元)


可以用下面的程序測試:
int checkSystem( )
{
union check
{
int i;
char ch;
} c;
c.i = 1;
return (c.ch ==1);
}
如果當前系統為大端模式這個函數返回 0;如果為小端模式,函數返回 1

大小端模式,內存地址高低位,寄存器高低位