寄存器與內存的區別:3d
一、寄存器位於CPU內部,執行速度快,但比較貴。 二、內存速度相對較慢,但成本較低,因此能夠作的很大。 三、寄存器和內存沒有本質區別,都是用於存儲數據的容器,都是定寬的。 四、寄存器經常使用的有8個:EAX、ECX、EDX、EBX、ESP、EBP、ESI、EDI。 五、計算機中的幾個經常使用計量單位:BYTE WORD DWORD
BYTE 字節 = 8(BIT) WORD 字 = 16(BIT) DWORD 雙字 = 32(BIT) 1KB = 1024 BYTE 1MB = 1024 KB 1GB = 1024 MB
內存的數量特別龐大,沒法每一個內存單元都起一個名字,因此用編號來代替,咱們稱計算機CPU是32位或者64位,主要指的就是內存編號的寬度,而不是寄存器的寬度。
有不少書上說之因此叫32位計算機是由於寄存器的寬度是32位,是不許確的,由於還有不少寄存器是大於32位的。指針
32位計算機的編號最大是32位,也就是32個1 換成16進製爲FFFFFFFF,也就是說,32位計算機內存尋址的最大範圍是**FFFFFFFF+1 **
code
內存的單位是字節,那內存中能存儲的信息最多爲:FFFFFFFF+1 字節 即4G,這也是爲何咱們在一個XP的系統上面若是物理內存超過4G是沒有意義的緣由。blog
一、內存
二、從指定內存中寫入/讀取數據內存
mov dword ptr ds:[0x0012FF34],0x12345678 mov eax,dword ptr ds:[0x0012FF34]
dword :要讀/寫多少 此時是4字節 byte == 1字節 word == 2字節
ptr: Point 表明後面是一個指針 (指針的意思就是裏面存的不是普通的值,而是個地址),也能夠理解成強轉,就是說把
ds:段寄存器 先不用管 記住就行
0x0012FF34:內存編號,必須是32位的 前面0能夠省略it
注意:地址編號不要隨便寫,由於內存是有保護的,並非全部的內存均可以直接讀寫(須要特別處理)
建議地址編號寫成esp的值容器
例子:隨便使用c語言編寫一個hello word程序,而後拉入od
咱們以讀取爲例子,把棧的值讀取到edx寄存器中
而後單步執行過去,會發現751D6359
這一串數據賦值給了edx中,把edx的值覆蓋掉了
二進制
尋址公式一:[當即數]
讀取內存的值:程序
mov eax,dword ptr ds:[0x13FFC4] //把地址0x13FFC4上的值給eax寄存器 mov eax,dword ptr ds:[0x13FFC8] //把地址0x13FFC8上的值給eax寄存器,在原來的地址上加4個字節,就是下一段數據的地址
內存中通常都是以dword爲單位,也就是4個字節。4 * 8bit = 32,經過上面知道二進制的32位1其實就是8個F,其實寬度就是8位。
MOV DWORD PTR DS:[0x13FFC4],eax MOV DWORD PTR DS:[0x13FFC8],ebx
獲取內存編號:im
LEA EAX,DWORD PTR DS:[0X13FFC4] LEA EAX,DWORD PTR DS:[ESP+8]
lea exp1,exp2
彙編中lea就是把 exp2 的地址給 exp1
尋址公式二:[reg] reg表明寄存器 能夠是8個通用寄存器中的任意一個
讀取內存的值:
MOV ECX,0x13FFD0 MOV EAX,DWORD PTR DS:[ECX]
向內存中寫入數據:
MOV EDX,0x13FFD8 MOV DWORD PTR DS:[EDX],0x87654321
獲取內存編號:
LEA EAX,DWORD PTR DS:[EDX] MOV EAX,DWORD PTR DS:[EDX]
尋址公式三:[reg+當即數]
讀取內存的值:
MOV ECX,0x13FFD0 MOV EAX,DWORD PTR DS:[ECX+4]
向內存中寫入數據:
MOV EDX,0x13FFD8 MOV DWORD PTR DS:[EDX+0xC],0x87654321
獲取內存編號:
LEA EAX,DWORD PTR DS:[EDX+4] MOV EAX,DWORD PTR DS:[EDX+4]
尋址公式四:[reg+reg*{1,2,4,8}]4
讀取內存的值:
MOV EAX,13FFC4 MOV ECX,2 MOV EDX,DWORD PTR DS:[EAX+ECX*4]
向內存中寫入數據:
MOV EAX,13FFC4 MOV ECX,2 MOV DWORD PTR DS:[EAX+ECX*4],87654321
獲取內存編號:
LEA EAX,DWORD PTR DS:[EAX+ECX*4]
尋址公式五:[reg+reg*{1,2,4,8}+當即數]
讀取內存的值:
MOV EAX,13FFC4 MOV ECX,2 MOV EDX,DWORD PTR DS:[EAX+ECX*4+4]
向內存中寫入數據:
MOV EAX,13FFC4 MOV ECX,2 MOV DWORD PTR DS:[EAX+ECX*4+4],87654321
獲取內存編號:
LEA EAX,DWORD PTR DS:[EAX+ECX*4+2]