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 | 字符串操作的目标指针:SS段的数据指针 | 7 | 0 - 0xFFFFFFFF |
主要用途中的描述仅为厂商建议、供开发者参考。
基本指令格式
|
|
在32位寄存器中,当指令的SRC超出数据宽度后,最高位会被丢弃。如 0x012345678会写入0x12345678
通用寄存器命名
REG | NAME |
---|---|
AX | Accumulator Register |
CX | Counter Register |
DX | Data Register |
BX | Base Register |
SP | Stack Pointer |
BP | Base Pointer |
SI | Source Index |
DI | Destination Index |
通用寄存器的结构
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 |
其中,以EAX为例,0~7位为AL,0~15位为AH,0~15位为AX,0~31位为EAX,以此类推。
POC:
|
|
分步运行可得:
|
|
MOV指令的语法
|
|
对应关系:
LETTERS | MEANING |
---|---|
r | 通用寄存器 |
m | 内存 |
imm | 立即数 |
r8 | 8位通用寄存器 |
m8 | 8位内存 |
imm8 | 8位立即数 |
常用指令
- MOV
- ADD
- SUB
- AND
- OR
- XOR
- NOT
内存读写
寄存器与内存的区别
- 寄存器位于CPU内部,执行速度块,但成本较高
- 内存速度相对较慢,但成本较低,因此容量会比寄存器大
- 寄存器与内存没有本质区别,都是用于存储数据的容器,都是定宽的
- 常用的寄存器有8个(通用寄存器的结构中列举的8个)
- 内存的数量特别多,因此无法给每个内存单位命名,故使用编号代替,内存的每个字节(BYTE)会有一个编号。CPU的位数指的是CPU的寻址宽度。
内存的基本概念
内存中的编号是以字节位单位的,每一个编号对应一个字节的宽度,可以存储8个0/1。
32位的计算机可以识别FFFFFFFF+1个内存地址,每个地址1BYTE,即4GB,所以32位的计算机最大可识别4GB的内存。
但是部分系统可以通过软件手段扩增寻址范围。
内存格式
- 每个内存单元的宽度为8(0~7)
[编号]
(如[0x12345678]
)称为内存地址- 地址的作用是确定操作的内存位置
内存的读写
内存的写入
与寄存器不同,在寄存器中写入多余的数据会被丢弃,内存是连续的,因此涉及内存读写一定要指定内存的宽度。
|
|
在内存中,部分地址是可以访问的,部分地址是不能访问的。操作不能访问的地址可能会掉入异常。
可以通过ESP的位置确定可以操作内存的地址。
内存的读取
例:
读取内存地址到EAX
|
|