在看這篇文章之前,可以先看一下這一篇
資料寬度
便於理解後續的內容
那麼這些暫存器之間有什麼關係呢?
我們先來看下圖
再看下面之前我們可以先看一下這篇文章
常見彙編指令及dtdebug
現在程式執行到mov eax,0xaaaaaaaa這條語句,但是還沒有執行,每次執行一次我們注意黑圈裡面eax的變化
執行第一條後的結果
然後執行第二條
然後執行第三條
然後執行第四條
看到這裡我相信大家已經明白了
乙個32位的通用暫存器它不僅包括16位暫存器還包括8位暫存器
為了讓大家明白我這裡用32位通用暫存器eax舉例說明
我們從上面**展示的效果可以發現eax的低位0~15是ax
ax的高位8~15為ah
ax的低位0~7低位是al
既然有了暫存器為什麼還要引入記憶體????
雖然它們本質沒有什麼區別,但是暫存器在cpu的內部,而且cpu提供的暫存器比較有限,而且非常昂貴。
記憶體的**比較便宜,所以可以做的很大
記憶體的數量特別龐大,無法為每個記憶體單元都起乙個名字,所以用編號來代替,我們稱計算機cpu是32位或者64位,主要指的是記憶體編號寬度,而不是暫存器的寬度。有很多書上面說之所以叫32位計算機是因為暫存器的寬度是32位,是不準確的,因為還有很多暫存器是大於32位的
如果你的計算機的cpu是32位,那麼你的記憶體編號為(為了方便,我這裡用16進製制來寫)
0x00000000
0x00000001
0x00000002
0x00000003每乙個編號對應的記憶體為乙個位元組……
…0xfffffff
mov dword ptr ds:[0x0012ff34],0x12345678 //把立即數0x12345678寫入記憶體位址編號為0x0012ff34的記憶體中。
mov eax,dword ptr ds:[0x0012ff34] //讀取記憶體編號為0x0012ff34裡面的值到暫存器eax中。
dword:表示要讀/寫多少 ,上面兩行指令寫的是4位元組,讀的也是4位元組,byte是乙個位元組, word表示兩個位元組。
ptr:point 代表後面是乙個指標(指標的意思就是裡面存的不是普通的值,而是乙個位址,也就是說是記憶體編號
ds:段暫存器,這裡先不說,把它先記住是段暫存器就行。
0x0012ff34:記憶體編號。
注意:位址編號不要隨便寫,因為記憶體是有保護的,並不是所有的記憶體都可以直接讀寫(需要特別處理)
定址公式一:【立即數】
讀取記憶體的值:
mov eax,dword ptr ds:[0x13ffc4]
mov eax,dword ptr ds:[0x13ffc8]
向記憶體中寫入資料:
mov dword ptr ds:[0x13ffc4],eax
mov dword ptr ds:[0x13ffc8],ebx
獲取記憶體編號:
lea eax,dword ptr ds:[0x13ffc4]
lea eax, dword ptr ds:[esp+8]
定址公式二:[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】*
讀取記憶體的值:
mov eax,13ffc4
mov ecx,2
mov edx,dword ptr ds:[eax+ecx4]
向記憶體中寫入資料:
mov eax,13ffc4
mov ecx,2
mov dword ptr ds:[eax+ecx4],87654321
獲取記憶體編號:
lea eax,dword ptr ds:[eax+ecx4]
定址公式五:【reg+reg+立即數】
讀取記憶體的值:
mov eax,13ffc4
mov ecx,2
mov edx,dword ptr ds:[eax+ecx4+4]
向記憶體中寫入資料:
mov eax,13ffc4
mov ecx,2
mov dword ptr ds:[eax+ecx4+4],87654321
獲取記憶體編號:
lea eax,dword ptr ds:[eax+ecx*4+2]
你們可以用dtdebug這個軟體去演示一下上面5個公式加深一下理解
通用暫存器 記憶體讀寫
暫存器的結構 eax 的一半為 ax ax 的一半為 al ax就是eax的一部分 al就是ax的一部分 低位 ah就是ax的一部分 高位 8位暫存器只能放2個十六進製制的數 乙個位元組 彙編指令 mov,add,sub,and,or,xor,not 計算機記憶體的每乙個位元組會有乙個編號 即記憶體...
暫存器(通用暫存器)
因為學習使用的是王爽的 組合語言 第3版 因此也只能提到8086cpo的暫存器。對於其他而言,原理都是相通的。對於8086暫存器,有14個暫存器,主要是 ax bx cx dx si di sp bp ip cs ss ds es psw。一 通用暫存器 8086的通用暫存器有ax bx cx dx...
通用暫存器和記憶體
計算機在執行時,需要提供資料的容器 容器由記憶體和cpu提供,記憶體提供的容器比較多 cpu提供的容器較少但其中的資料計算速度快 cpu提供的容器就是暫存器,暫存器有特定的資料寬度,決定了該暫存器儲存資料的範圍 1.常用的32位暫存器 32位通用暫存器還可以拆分來使用 將低16位當做16位暫存器 一...