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