詳解通用暫存器 記憶體讀寫

2021-10-25 07:20:36 字數 3300 閱讀 1845

在看這篇文章之前,可以先看一下這一篇

資料寬度

便於理解後續的內容

那麼這些暫存器之間有什麼關係呢?

我們先來看下圖

再看下面之前我們可以先看一下這篇文章

常見彙編指令及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位暫存器 一...