寄存器学习笔记
寄存器
通用寄存器可以储存任何数据和指令,虽然叫通用寄存器,但每一个都有各自的用途
通用寄存器
| 32位 | 16位 | 8位 |
|---|---|---|
| EAX(累加器) | AX | AL |
| ECX(记数寄存器) | CX | CL |
| EDX | DX | DL |
| EBX | BX | BL |
| ESP(栈指针寄存器 extended stack pointer) | SP | AH |
| EBP | BP | CH |
| ESI(源变址寄存器) | SI | DH |
| EDI(目标变址寄存器) | DI | BH |
16位寄存器使用对应32位寄存器的低十六位
8位寄存器使用32位寄存器的两个字节 L为低八位,H为高八位
例如
1 | MOV AH,1 |
假设EAX当前为0XFFFFFFFF,执行第一行指令后变为0XFFFF01FF,执行第二行指令后变为0XFFFF0102
其他寄存器
- EFL
FLAG寄存器,下面有详解 - EIP
用来储存CPU要读取的指令的地址,可以使用JMP指令修改 - FS
段寄存器,指向当前活动线程的TEB结构
FS段寄存器
| 偏移 | 说明 |
|---|---|
| 000 | 指向SEH链指针 |
| 004 | 线程堆栈顶部 |
| 008 | 线程堆栈底部 |
| 00C | SubSystemTib |
| 010 | FiberData |
| 014 | ArbitraryUserPointer |
| 018 | FS段寄存器在内存中的镜像地址 |
| 020 | 进程PID |
| 024 | 线程ID |
| 02C | 指向线程局部存储指针 |
| 030 | PEB结构地址(进程结构) |
| 034 | 上个错误号 |
地址值的五种形式
立即数
读取内存的值:
MOV EAX,DWORD PTR DS:[0x13FFC4]向内存写入数据:
MOV DWORD PTR DS:[0X13FFC4],EAX[reg]
读取内存的值:
MOV ECX,0X13FFD0MOV EAX,DWORD PTR DS:[ECX]向内存写入数据:
MOV EDX,0X13FFD8MOV DWORD PTR DS:[EDX],0X87654321[reg + 立即数]
读取内存的值:
MOV ECX,0X13FFD0MOV EAX,DWORD PTR DS:[ECX+4]向内存写入数据:
MOV EDX,0X13FFD8MOV DWORD PTR DS:[EDX+0XC],0X87654321[reg + reg * (1,2,4,8)]
多用于高级语言中声明数组
读取内存的值:
MOV EAX,13FFC4MOV ECX,2MOV EDX,DWORD PTR DS:[EAX+ECX*4]向内存写入数据:
MOV EAX,13FFC4MOV ECX,2MOV DWORD PTR DS:[EAX+ECX*4],87654321[reg + reg * (1,2,4,8) + 立即数]
读取内存的值:
MOV EAX,13FFC4MOV ECX,2MOV EDX,DWORD PTR DS:[EAX+ECX*4+4]向内存写入数据:
MOV EAX,13FFC4MOV ECX,2MOV DWORD PTR DS:[EAX+ECX*4+4],87654321
储存模式
有两种储存模式
大端模式:数据高位在低位,数据低位在高位
小端模式:数据低位在低位,数据高位在高位
例如有如下代码:
1 | MOV WORD PTR DS:[0X00000000],0X1A2C |
对于数据来说,1A在高位,2C在低位,而对于内存来说0X00000000是低位,0XFFFFFFFF是高位
此时在大端模式中内存中储存情况是0X00000000的值为0X1A,0X00000001的值为0X2C。小端模式则相反,0X2C(也就是低位)储存在内存中的低位
