1. 程式人生 > >彙編學習(6)深入理解little-

彙編學習(6)深入理解little-

菜雞初學彙編,總結下 little-endian。這個破東西也困擾我好久,也算終於搞明白了。

little-endian 簡單來說即低位位元組排放在記憶體的低地址端,高位位元組排放在記憶體的高地址端。

首先,明確一點,最小的單元都是位元組;資料在記憶體中的存放是以位元組為單位的。位元組內的內容沒有所謂的高位高址,低位低址。

在記憶體中存放資料時,先將這個資料拆分為一個一個的位元組。再將高位位元組放在高址,低位位元組放低址。

要注意記憶體資料(資料在記憶體中實際位置)和 數值資料(實際應用的數值)的區別。真實記憶體中資料的存放是高位放高址,低位放低址。 而變為數值資料時是從高位到低位連起來的,例如 原本資料是int a=0x12345678,而實際放在記憶體中是 78 56 34 12 ,將其作為數值應用時,要將高位從低位連起來。更直觀點是這樣的。
在這裡插入圖片描述


再來看看數值資料是如何轉變的。
在這裡插入圖片描述
記憶體中真實儲存情況是這樣的,但是應用為資料時(即這一格代表的數是多少)要從高址到低址讀,即EBP-4這一格代表的資料是12345678。
在一些偵錯程式上,例如ollydbg中,顯示一格對應的資料時,一般已經轉化為應用資料了(例如OD的堆疊視窗),而不是記憶體中的真實儲存情況,這一點要清楚。

還需要清楚知道的是little-endian的存放機制的物件是單個元素的數值在記憶體的存放對陣列的元素的存放需要區別。

陣列的定址公式是 :首元素的地址+ n * 陣列單個元素所佔位元組數。
所以陣列的存放是高位的元素
在低址,低位的元素在高址。這裡要和單個元素的存放區別開。
例如 char a[5]=“abcde”;
則元素在記憶體中的儲存是
在這裡插入圖片描述


再例如 int a[3]={0xaabbccdd,0xbbccddee,0xccddeeff};
則在記憶體中儲存是
在這裡插入圖片描述
這兩個例子中都是真實儲存情況,不是應用數值。
後者這個例子中,每個元素的儲存方式還是按照little-endian的方式儲存。從這個例子,可以深入理解到陣列的儲存方式和 單個元素儲存方式。