寄存器

通用寄存器可以储存任何数据和指令,虽然叫通用寄存器,但每一个都有各自的用途

通用寄存器

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
2
MOV AH,1
MOV AL,2

假设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 上个错误号

地址值的五种形式

  1. 立即数

    读取内存的值:
    MOV EAX,DWORD PTR DS:[0x13FFC4]

    向内存写入数据:
    MOV DWORD PTR DS:[0X13FFC4],EAX

  2. [reg]

    读取内存的值:
    MOV ECX,0X13FFD0
    MOV EAX,DWORD PTR DS:[ECX]

    向内存写入数据:
    MOV EDX,0X13FFD8
    MOV DWORD PTR DS:[EDX],0X87654321

  3. [reg + 立即数]

    读取内存的值:
    MOV ECX,0X13FFD0
    MOV EAX,DWORD PTR DS:[ECX+4]

    向内存写入数据:
    MOV EDX,0X13FFD8
    MOV DWORD PTR DS:[EDX+0XC],0X87654321

  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

  5. [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


储存模式

有两种储存模式

  1. 大端模式:数据高位在低位,数据低位在高位

  2. 小端模式:数据低位在低位,数据高位在高位

例如有如下代码:

1
MOV WORD PTR DS:[0X00000000],0X1A2C

对于数据来说,1A在高位,2C在低位,而对于内存来说0X00000000是低位,0XFFFFFFFF是高位

此时在大端模式中内存中储存情况是0X00000000的值为0X1A,0X00000001的值为0X2C。小端模式则相反,0X2C(也就是低位)储存在内存中的低位