通用寄存器和內存


計算機在運行時,需要提供數據的容器;
容器由內存和cpu提供,內存提供的容器比較多;cpu提供的容器較少但其中的數據計算速度快;
cpu提供的容器就是寄存器,寄存器有特定的數據寬度,決定了該寄存器存儲數據的范圍;
 
1.常用的32位寄存器
 
32位通用寄存器還可以拆分來使用;將低16位當做16位寄存器;
一些16位寄存器也可以繼續拆分;高8位和低8位分別當做8位寄存器來使用;
 
2.mov指令
mov 目標操作數,源操作數
作用:拷貝源操作數到目標操作數
 
注意:
    源操作數可以是立即數、通用寄存器、段寄存器、內存單元;
    目標操作數可以是通用寄存器、段寄存器、內存單元;
    操作數的寬度必須一樣;
    源操作數和目標操作數不能同時為內存單元;
 
mov的語法:
 
3.從內存中讀寫數據
內存由一段連續的內存單元組成,每個內存單元有8位;
32位機正常的尋址范圍為0~FFFFFFFF,也就是4GB;
但這不是確定的,有些內存區域可能被固定無法訪問,並且操作系統也可能擴展內存;
 
數據有3中類型:
    字節    ->byte,寬度為8位
    字    ->word,寬度為兩個字節16位
    雙字    ->dword,寬度為兩個字32位
 
用指令從內存中讀寫數據時,需要指明數據的類型
例如:
mov dword ptr ds:[0x0012FF34],0x12345678
 
4.內存尋址的幾種方式
1)[立即數]
從內存中讀
    執行完后eax中的值為ds:[0x13ff4c]處的值;
mov eax,dword ptr ds:[0x13ff4c]
寫:
mov dword ptr ds:[0x13ff4c],0x12345678
取內存編號:
    lea指令用來獲取內存地址;
    有時候,某個內存地址中的值隨時可能會變,獲取內存地址可以用來追蹤該值;
    下面的的指令執行后eax的值為13ff4c;
lea eax,dword ptr ds:[0x13ff4c]
 
2)[reg]
reg表示寄存器,可以是8個通用寄存器中的任意一個;
從內存中讀:
    相當於 mov eax, dword ptr ds:[0x134ff4c]
mov ecx,0x13ff4c
mov eax, dword ptr ds:[ecx]
寫:
mov dword ptr ds:[ecx],0x12345678
獲取內存編號:
    這里獲取的是ecx的值,也就是將內存地址保存在ecx中了;
lea eax,dword ptr ds:[ecx]
 
3)[reg+立即數]
讀:獲取內存地址ds:[0x12345678]處的值
mov ecx,0x12345674
mov eax,dword ptr ds:[ecx+4]
 
4)[reg+reg*{1,2,4,8}]
reg代表任意一個通用寄存器;
{1,2,4,8}代表只能乘以大括號中的其中一個數;
讀:
mov eax,12345
mov ecx,2
mov edx,ds:[eax+ecx*4]
 
5)[reg+reg*{1,2,4,8}+立即數]
讀:
mov eax,12345
mov ecx,2
mov edx,ds:[eax+ecx*4+4]
 
5.堆棧
在程序中,經常需要存放臨時數據;但寄存器數量有限,而將臨時數據放入內存不方便找到;堆棧就是用來解決這一問題的;
使用堆棧的目的:
    1】用於臨時存儲一些數據;
    2】能夠記錄存儲了多少數據;
    3】能非常快速找到某個數據;
 
例如:下面堆棧的實現;越往上內存地址越小(windows中堆棧是往低位拓展的)
 
1)模擬入棧
ebx保存棧底地址,ebx保存棧頂地址;
空棧時棧底和棧頂相等;
當一個數據入棧時,先將數據存入棧頂前一個單元,再將棧頂的值修改為該單元的內存地址;
mov ebx,0x18ffb0
mov edx,0x18ffb0
mov dword ptr [edx-4],0xaaaaaaaa
sub edx,4
也可以用lea指令來實現
mov ebx,0x18ffb0
mov edx,0x18ffb0
lea edx,dword ptr [edx-4]
mov dword ptr [edx],0xaaaaaaaa
 
2)從棧中找數據
從棧底讀第二個數
mov esi,dword ptr [ebx-4]
從棧頂讀第二個數
mov esi,dword ptr [edx+4]
 
3)出棧
mov esi,dword ptr [edx]
lea edx,dword ptr [edx+4]
 
4)關於棧的指令
一般情況下,操作系統將寄存器Ebp用來村粗棧底的值;
寄存器Esp用來存儲棧頂的值;
入棧指令:push
push 0x666666
push ecx
出棧指令:pop
pop esi
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM