8個通用寄存器和內存尋址方式


什么是通用寄存器

通用寄存器可用於傳送暫存數據,也可參與算術邏輯運算,並保存運算結果。除此之外,它們還各自具有一些特殊功能。
匯編語言程序員必須熟悉每個寄存器的一般用途和特殊用途,只有這樣,才能在程序中做到正確、合理地使用它們。

32位通用寄存器

寄存器 主要用途 編號 存儲數據的范圍
EAX 累加器 0 0 - 0xFFFFFFFF
ECX 計數 1 0 - 0xFFFFFFFF
EDX I/O指針 2 0 - 0xFFFFFFFF
EBX DS段的數據指針 3 0 - 0xFFFFFFFF
ESP 堆棧指針 4 0 - 0xFFFFFFFF
EBP SS段的數據指針 5 0 - 0xFFFFFFFF
ESI 字符串操作的源指針;SS段的數據指針 6 0 - 0xFFFFFFFF
EDI 字符串操作的目標指針;ES段的數據指針 7 0 - 0xFFFFFFFF

32位寄存器是由2個16位寄存器構成

寄存器 編號(二進制) 編號(十進制)
32位 8位
EAX AL 0
ECX CL 1
EDX DL 10
EBX BL 11
ESP AH 100
EBP CH 101
ESI DH 110
EDI BH 111

mov指令

MOV 的語法:mov 目標操作數,源操作數 作用將:源拷貝到目的
MOV r/m8,r8
MOV r/m16,r16
MOV r/m32,r32
MOV r8,r/m8
MOV r16,r/m16
MOV r32,r/m32
MOV r8, imm8
MOV r16, imm16
MOV r32, imm32

注意使用規則

  • 源操作數可以是 立即數、通用寄存器、段寄存器、或者內存單元
  • 目標操作數 可以是寄存器、段寄存或者內存單元
  • 操作數的目標操作數的數據寬度必須大於源操作數
  • 源操作數和目標操作數不能同時為內存單元

ADD指令

ADD 的語法:ADD 目標操作數,源操作數 作用:將源操作數加到目標操作數上
ADD r/m8, imm8
ADD r/m16,imm16
ADD r/m32,imm32
ADD r/m16, imm8
ADD r/m32, imm8
ADD r/m8, r8
ADD r/m16, r16
ADD r/m32, r32
ADD r8, r/m8
ADD r16, r/m16
ADD r32, r/m32

SUB指令

SUB 的語法:
例如 sub eax ,ebx;
eax = eax-ebx
SUB 目標操作數,源操作數
作用:將源操作數減到目標操作數上
SUB r/m8, imm8
SUB r/m16,imm16
SUB r/m32,imm32
SUB r/m16, imm8
SUB r/m32, imm8
SUB r/m8, r8
SUB r/m16, r16
SUB r/m32, r32
SUB r8, r/m8
SUB r16, r/m16
SUB r32, r/m32

or指令

OR 的語法:
OR 目標操作數,源操作數
作用:將源操作數與目標操作數或運算后將結果保存到目標操作數中
OR r/m8, imm8
OR r/m16,imm16
OR r/m32,imm32
OR r/m16, imm8
OR r/m8, r8
OR r/m16, r16
OR r/m32, r32
OR r8, r/m8
OR r16, r/m16
OR r32, r/m32

xor指令

XOR 的語法:
XOR 目標操作數,源操作數
作用:將源操作數與目標操作數異或運算后將結果保存到目標操作數中
XOR r/m8, imm8
XOR r/m16,imm16
XOR r/m32,imm32
XOR r/m16, imm8
XOR r/m8, r8
XOR r/m32, r32
XOR r8, r/m8
XOR r16, r/m16
XOR r32, r/m32

NOT指令

取反 0變1 1變0

LEA指令


lea:Load Effective Address,即裝入有效地址的意思,它的操作數就是地址
lea r32,dword ptr ds:[內存編號(地址)]
將內存地址賦值給32位通用寄存器
lea是傳址,mov是傳值,注意區別

內存

內存(Memory)是計算機的重要部件之一,也稱內存儲器主存儲器,它用於暫時存放CPU中的運算數據,與硬盤等外部存儲器交換的數據。它是外存與CPU進行溝通的橋梁,計算機中所有程序的運行都在內存中進行,內存性能的強弱影響計算機整體發揮的水平。只要計算機開始運行,操作系統就會把需要運算的數據從內存調到CPU中進行運算,當運算完成,CPU將結果傳送出來。

注意區別我們所說的32位一般都是說的是內存地址尋址范圍,而不是說寄存器的數據寬度
32位計算機的編號最大是32位,也就是32個1 換成16進制為FFFFFFFF,也就是說,32位計算機內存尋址的最大范圍是FFFFFFFF+1

內存的單位是字節,那內存中能存儲的信息最多為:FFFFFFFF+1 字節 即4G,這也是為什么我們在一個XP的系統上面如果物理內存超過4G是沒有意義的原因

只要是32位的計算機,那么最多識別的內存為4G,對嗎?
不對。可以通過打補丁,或者拓展操作系統來,尋址方式是由操作系統決定的

內存格式

從指定內存中寫入/讀取數據

只要是涉及到內存讀寫的,一定要指定內存的寬度

mov 讀/寫的數據寬度 ptr ds:[地址],XXX
例:

mov eax,dword ptr ds:[0x0012FF34]
dword :要讀/寫多少 此時是32bit (byte 字節 8bit word字 16bit dword雙字 32bit)

ds:段寄存器 這里為數據段(后續學習會講段寄存器)

0x0012FF34 內存編號,必須是32位的,前面的0可以省略

注意:內存編號不要隨便寫,因為內存是有保護的,並不是所有的內存都可以直接讀寫(需要特別處理)

內存尋址公式

尋址公式一:[立即數]

讀取內存的值:

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代表寄存器 可以是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 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]

尋址公式四:[reg+reg*(1,2,4,8)] 1 2 4 8 分別是 2^0 ,2^1 ,22,23

讀取內存的值:

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]

尋址公式五:[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]


免責聲明!

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



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