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

2021-09-01 20:59:41 字數 1289 閱讀 3734

菜雞初學彙編,總結下 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]=;

則在記憶體中儲存是

這兩個例子中都是真實儲存情況,不是應用數值。

後者這個例子中,每個元素的儲存方式還是按照little-endian的方式儲存。從這個例子,可以深入理解到陣列的儲存方式和 單個元素儲存方式。

彙編 scanf scanf深入理解

scanf 是c語言中的乙個輸出函式。與printf函式一樣,都被宣告在標頭檔案stdio.h裡,因此在使用scanf函式時要加上 include 在有一些實現中,printf函式與scanf函式在使用時可以不使用預編譯命令 include 它是格式輸入函式,即按使用者指定的格式從鍵盤上把資料輸入到...

深入理解ES6 解構

解構時一種打破資料結構,將其拆分為更小部分的過程。解構在實際開發中經常會應用到物件和陣列中。關於解構的基本用法,請參考 es6 變數的宣告及解構賦值 const node let node 對已經宣告的變數賦值 const node let a,b node const obj let obj co...

深入理解C語言 深入理解指標

關於指標,其是c語言的重點,c語言學的好壞,其實就是指標學的好壞。其實指標並不複雜,學習指標,要正確的理解指標。指標也是一種變數,占有記憶體空間,用來儲存記憶體位址 指標就是告訴編譯器,開闢4個位元組的儲存空間 32位系統 無論是幾級指標都是一樣的 p操作記憶體 在指標宣告時,號表示所宣告的變數為指...