32位通用寄存器
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位 |
16位 |
8位 |
|
|
EAX |
AX |
AL |
000 |
0 |
ECX |
CX |
CL |
001 |
1 |
EDX |
DX |
DL |
010 |
2 |
EBX |
BX |
BL |
011 |
3 |
ESP |
SP |
AH |
100 |
4 |
EBP |
BP |
CH |
101 |
5 |
ESI |
SI |
DH |
110 |
6 |
EDI |
DI |
BH |
111 |
7 |
汇编指令
符号 |
含义 |
r |
寄存器 |
m |
内存 |
imm |
立即数 |
r8 |
8位通用寄存器 |
m8 |
8位内存 |
imm8 |
8位立即数 |
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
MOV 目标操作数,源操作数
作用:拷贝源操作数到目标操作数
- 源操作数可以是立即数、通用寄存器、段寄存器、或者内存单元
- 目标操作数可以是通用寄存器、段寄存器或者内存单元
- 操作数的宽度必须一样
- 源操作数和目标操作数不能同时为内存单元
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
ADD 目标操作数,源操作数
作用:将源操作数加到目标操作数上
SUB指令
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
SUB 目标操作数,源操作数
作用:将源操作数减到目标操作数上
AND指令
AND 的语法:
- AND r/m8, imm8
- AND r/m16,imm16
- AND r/m32,imm32
- AND r/m16, imm8
- AND r/m32, imm8
- AND r/m8, r8
- AND r/m16, r16
- AND r/m32, r32
- AND r8, r/m8
- AND r16, r/m16
- AND r32, r/m32
AND 目标操作数,源操作数
作用:将源操作数与目标操作数与运算后将结果保存到目标操作数中
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
OR 目标操作数,源操作数
作用:将源操作数与目标操作数或运算后将结果保存到目标操作数中
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
XOR 目标操作数,源操作数
作用:将源操作数与目标操作数异或运算后将结果保存到目标操作数中
NOT指令
NOT 的语法:
NOT r/m8
NOT r/m16
NOT r/m32
NOT 操作数
作用:取反
LEA指令
lea:Load Effective Address,即装入有效地址的意思,它的操作数就是地址
lea r32,dword ptr ds:[内存编号(地址)]
将内存地址赋值给32位通用寄存器
lea是传址,mov是传值,注意区别
内存
内存的数量特别庞大,无法每个内存单元都起一个名字,所以用编号来代替,我们称计算机CPU是32位或者64位,主要指的就是内存编号的宽度,而不是寄存器的宽度。
有很多书上说之所以叫32位计算机是因为寄存器的宽度是32位,是不准确的,因为还有很多寄存器是大于32位的
通常所说的32位计算机是指CPU字长为32位
计算机内存的每一个字节会有一个编号(即内存编号的单位是字节)
0x00000000 |
0x00000001 |
0x00000002 |
.... |
.... |
.... |
.... |
.... |
.... |
0xFFFFFFFF |
32位计算机的编号最大是32位,也就是32个1 换成16进制为FFFFFFFF,也就是说,32位计算机内存寻址的最大范围是FFFFFFFF+1
内存的单位是字节,那内存中能存储的信息最多为:FFFFFFFF+1 字节 即4G,这也是为什么我们在一个XP的系统上面如果物理内存超过4G是没有意义的原因
只要是32位的计算机,那么最多识别的内存为4G,对吗?
不对。可以通过打补丁,或者拓展操作系统来,寻址方式是由操作系统决定的
内存格式
- 每个内存单元的宽度为8
- [编号]称为地址,用[]来区分立即数和内存地址
- 地址的作用:当我们想从内存中读取数据或者想向内存中写入数据,首先应该找到要读、写的位置。就像写信要写地址一样。
从指定内存中写入/读取数据
只要是涉及到内存读写的,一定要指定内存的宽度
mov 读/写的数据宽度 ptr ds:[地址],XXXX
例:
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]
寻址公式三:[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]
寻址公式四:[reg+reg*{1,2,4,8}]
读取内存的值:
MOV EAX,13FFC4
MOV ECX,2
MOV EDX,DWORD PTR DS:[EAX+ECX*4]
向内存中写入数据:
MOV EAX,13FFC4
MOV ECX,2
MOV DWORD PTR DS:[EAX+ECX*4],87654321
获取内存编号:
LEA EAX,DWORD PTR DS:[EAX+ECX*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]