彙編基礎學習5

2021-05-02 03:06:31 字數 1482 閱讀 7863

文章** http://www.mcany.cn/article/280.htm

博主 沒落的殘陽

今天我給大家來講解下我們記憶體中資料的儲存以及訪問。這節課的基礎也是非常重要的。。因為80386的資料位址線是32根,所以它一次可以傳送資料是4個位元組。所以我們記憶體單元是按照4個位元組來對齊的。 用高階語言的話,就是dword型別也就是4個位元組。

首先來看下00403025h在記憶體中的存放情況。因為我們記憶體中是一段連續的位元組單元。乙個記憶體單元存放乙個位元組。 並且是按照低位址結尾的。也就是低位址是放在記憶體中的低位址處。高位址放在記憶體中的高位址處。

為何我們一些程式通過編譯器以及鏈結器生成後,我們通過一些16進製制編輯工具(如c32asm ,ue等)開啟後,總是看到一些rva位址是倒序的形式。這就是因為我們編譯的程式必須按照我們記憶體中的存放形式,這樣我們的程式被對映到記憶體後,我們cpu才能正確的讀入,否則讀取的就是錯誤的資料。

之前我們已經簡單的講過mov語句,例如將立即數00403025h傳送到eax暫存器。

mov eax, 00403025h 等. 之前我們還學過將乙個記憶體單元的資料傳送到乙個暫存器中。

這樣的格式呢就是mov 暫存器名, [記憶體單元的偏移位址]

""表示的就是乙個記憶體單元。 "[***x]" 中的***x就表示的記憶體單元的偏移位址。 因為80386是平坦模式定址,所以此時不需要段暫存器。

上面是將記憶體單元的資料傳送到暫存器。那麼如何將暫存器中的值傳送到記憶體單元呢。?

呵呵,我們反之其道而行。

例如eax = 00403050h ,我們想把eax暫存器的值傳送到記憶體單元[00405085]處

也就是這樣。 mov [00405085], eax

這樣的格式呢就是 mov [記憶體單元的偏移位址], 暫存器或者是立即數(也可以說ascii碼)   嘿,想起免殺課程動態恢復ascii的那節課程了嗎?其實利用的就是這個原理。

到這裡我在給大家總結一下:

mov 暫存器名, [記憶體單元的偏移位址]  ;這樣的形式就是讀取記憶體單元的資料

mov [記憶體單元的偏移位址], 暫存器或者是立即數(也可以說ascii碼)   ;這樣的形式就是向記憶體單元中寫入資料。

小作業:

1.假如此時eax暫存器的值=00004000h, 那麼00402530h位址的雙字記憶體單元中存放的資料是 70h 60h 50h 00h

那麼執行mov eax, [00402530h] 後,eax的暫存器值等於多少?

2.假如此時eax暫存器的值=00305060h, 那麼此時00403520h位址的雙字記憶體單元中存放的資料是 00h 50h 60h 00h,那麼執行

mov eax, 00403520h 後, eax的暫存器值等於多少?

3.假如此時eax暫存器的值=00403020h, 那麼ebx暫存器的值是00305025h, 00305025h位址的雙字記憶體單元存放的資料是 00h 30h 50h 00h

那麼執行 mov eax, [ebx] 後,eax暫存器的值等於多少?

彙編學習 5

1.統計字串長度,將結果按十六進製制字串格式輸出 要求 使用重複字首和條件設定指令 char s 23 81 char len 81 printf s scanf s s 23 asm printf s的長度為 十六進製制 s h n len 子程式s len 功能 獲取字串長度 返回值 eax 字...

彙編基礎一日一學習5

那麼棧到底是什麼呢?棧是一種具有特殊的訪問方式的儲存空間。它的特殊就是在於最後進入這個空間的資料,最先出去。舉個例子,假如這時我們有3個動物。貓咪 猴子 兔子。那麼我們按先後的順序我們先把貓咪放進棧中,然後再把猴子放到棧中,最後把兔子放到棧中。那麼此時,大家可以看到。兔子現在存在棧頂。那麼此時我們取...

彙編學習 NO5

1.ret 用棧中的資料,修改ip的內容,從而實現近轉移.2.retf 用棧中的資料,修改cs和ip的內容,從而實現遠轉移.3.可以修改ip,或同時修改cs和ip的指令統稱為轉移指令 4.只修改ip時,稱為段內轉移 同時修改cs和ip時.稱為段間轉移 5.由於轉移指令對ip修改範圍不同,段內轉移又分...