彙編學習(6)深入理解little-
阿新 • • 發佈:2018-12-26
菜雞初學彙編,總結下 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的方式儲存。從這個例子,可以深入理解到陣列的儲存方式和 單個元素儲存方式。