通用寄存器

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

寄存器彼此之间不是独立的,大的包含小的(硬件发展历程)

1
2
3
4
5
6
MOV EAX,0xAAAAAAAA
MOV AX,0xBBBB
MOV AH,0xCC
MOV AL,0xDD

EAX: -> 0xAAAABBBB -> 0xAAAACCBB -> 0xAAAACCDD

基础指令

MOV 指令:

1
2
3
4
5
6
7
8
9
10
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 r/m8, imm8
MOV r/m16, imm16
MOV r/m32, imm32
r-通用寄存器;m-内存;imm-立即数;r8-8位通用寄存器;m8-8位内存;imm8-8位立即数

MOV 目标操作数, 源操作数

作用:拷贝源操作数到目标操作数

  1. 源操作数可以是立即数、通用寄存器、段寄存器、内存单元
  2. 目标操作数可以是通用寄存器、段寄存器、内存单元
  3. 操作数的宽度必须一样
  4. 源操作数和目标操作数不能同时为内存单元

ADD 指令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
ADD AL, imm8
ADD AX, imm16
ADD EAX, imm32
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 指令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
SUB AL, imm8
SUB AX, imm16
SUB EAX, imm32
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

AND 指令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
AND AL, imm8
AND AX, imm16
AND EAX, imm32
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

OR 指令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
OR AL, imm8
OR AX, imm16
OR EAX, imm32
OR r/m8, imm8
OR r/m16,imm16
OR r/m32,imm32
OR r/m16, imm8
OR r/m32, 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 指令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
XOR AL, imm8
XOR AX, imm16
XOR EAX, imm32
XOR r/m8, imm8
XOR r/m16,imm16
XOR r/m32,imm32
XOR r/m16, imm8
XOR r/m32, imm8
XOR r/m8, r8
XOR r/m16, r16
XOR r/m32, r32
XOR r8, r/m8
XOR r16, r/m16
XOR r32, r/m32

NOT 指令:

1
2
3
NOT r/m8
NOT r/m16
NOT r/m32

内存读写

寄存器与内存的区别:

  1. 寄存器位于 CPU 内部,执行速度快,但比较贵

  2. 内存速度相对较慢,但成本较低,所以可以做的很大

  3. 寄存器和内存没有本质区别,都是用于存储数据的容器,都是定宽的

  4. 寄存器常用的有 8 个:EAX、ECX、EDX、EBX、ESP、EBP、ESI、EDI

  5. 计算机中的几个常用计量单位:BYTE WORD DWORD

    BYTE 字节 = 1 byte 8(BIT)

    WORD 字 = 16(BIT)

    DWORD 双字 = 32(BIT)

  6. 内存的数量特别庞大,无法每个内存单元都起一个名字,所以用编号来代替。我们称计算机 CPU 是 32 位或 64 位的,有很多书上说之所以叫 32 位计算机是因为寄存器的宽度是 32 位,是不准确的,因为还有很多寄存器是大于 32 位的。正确的解释为寻址范围为 32 位。

    内存编号范围:0x00000000~0xFFFFFFFF,内存的单位是字节,能存储的信息最多是 FFFFFFFF+1 字节,即 4G

  7. 只要是 32 位计算机,那么最多是别的内存为 4G,对吗?

    不一定,可以通过打补丁等形式拓展

内存:

  1. 内存格式

  2. 从指定内存中写入/读取数据

    1
    2
    mov dword ptr ds:[0x0012FF34], 0x12345678
    mov eax, dword ptr ds:[0x0012FF34]

    dword:要读/写多少(涉及到内存读写的,一定要指定宽度),byte = 1 字节,word = 2 字节,dword = 4 字节

    ptr:point,代表后面是一个指针(不是值,是地址)

    ds:段寄存器

    0x0012FF34:内存编号,必须 32 位,前面的 0 可以省略

    注意:地址编号不要随便写,因为内存有保护机制,并不是所有的都可以直接读写(需要特别处理),建议做练习时地址编号写成 esp 的值