計算機在執行時,需要提供資料的容器;
容器由記憶體和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+立即數]
mov ecx,0x12345674
mov eax,dword ptr ds:[ecx+4]
4)[reg+reg*]
reg代表任意乙個通用暫存器;
{1,2,4,8}代表只能乘以大括號中的其中乙個數;
讀:mov eax,12345
mov ecx,2
mov edx,ds:[eax+ecx*4]
5)[reg+reg*+立即數]
讀:mov eax,12345
mov ecx,2
mov edx,ds:[eax+ecx*4+4]
5.堆疊
在程式中,經常需要存放臨時資料;但暫存器數量有限,而將臨時資料放入記憶體不方便找到;堆疊就是用來解決這一問題的;
使用堆疊的目的:
1】用於臨時儲存一些資料;
2】能夠記錄儲存了多少資料;
3】能非常快速找到某個資料;
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
暫存器(通用暫存器)
因為學習使用的是王爽的 組合語言 第3版 因此也只能提到8086cpo的暫存器。對於其他而言,原理都是相通的。對於8086暫存器,有14個暫存器,主要是 ax bx cx dx si di sp bp ip cs ss ds es psw。一 通用暫存器 8086的通用暫存器有ax bx cx dx...
通用暫存器 記憶體讀寫
暫存器的結構 eax 的一半為 ax ax 的一半為 al ax就是eax的一部分 al就是ax的一部分 低位 ah就是ax的一部分 高位 8位暫存器只能放2個十六進製制的數 乙個位元組 彙編指令 mov,add,sub,and,or,xor,not 計算機記憶體的每乙個位元組會有乙個編號 即記憶體...
詳解通用暫存器 記憶體讀寫
在看這篇文章之前,可以先看一下這一篇 資料寬度 便於理解後續的內容 那麼這些暫存器之間有什麼關係呢?我們先來看下圖 再看下面之前我們可以先看一下這篇文章 常見彙編指令及dtdebug 現在程式執行到mov eax,0xaaaaaaaa這條語句,但是還沒有執行,每次執行一次我們注意黑圈裡面eax的變化...