0x01 什么是寄存器,它们的用途是什么?
32-bit 寄存器: EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI 和 EIP
EAX – 累加器寄存器
EBX – 基础寄存器
ECX – 计数器寄存器
EDX – 数据寄存器
ESI – 源指针
EDI – 目的地指针
EBP – 基本指针
ESP – 堆栈指针
数据寄存器:EAX EBX ECX EDX
EAX(累加器):累加器用于除法、乘法和其他格式的指令,也可以作为通用寄存器。
EBX(基础索引):它可以引导内存数据,也可以作为通用寄存器。
ECX(计数器):通用寄存器,可以做不同指令的寄存器,还可以具有存储数据偏移地址的功能
EDX(数据):通用寄存器,可以用于乘法或者除法,还可以引导内存数据
堆栈指针:ESP EBP
EBP(基础指针):EBP指向一个存储位置。除了用作通用寄存器外,几乎总是将其作为基地址。
ESP:指向堆栈顶部的索引
索引寄存器:EDI ESI
EDI(目标索引):EDI通常寻址一些字符串指令的字符串目标数据。它也可以起到32或者16位通用寄存器的作用。
ESI(源索引): ESI被用作ESI或者SI,源索引寄存器通常寻址字符串指令的源字符串数据。像EDI一样,ESI也可以起到通用寄存器的作用。
段寄存器:CS DS ES FS GS SS
其余的寄存器,段寄存器与其他寄存器一起合并生成内存地址。在众多微处理器中有的有四个段寄存器,有的有六个段寄存器。段寄存器在实模式和保护模式的功能不一。
CS(代码) 代码段是保存微处理器执行代码的内存段。代码段寄存器持有段的起始位置。在实模式它定义64K内存段的起始位置。在保护模式它选择它选择一个描述符来描述段得起始位置和长度。在8088-80286上代码段的限制是64K,在80386以上的保护模式中它的大小是4G。
DS(数据) 数据段是一个内存段包括大多数的程序中使用的数据。数据段中的数据被通过偏移地址或者持有偏移地址的其他寄存器的内容访问。像代码段一样,它的大小在8088-80286上代码段的限制是64K,在80386以上的保护模式中是4G。
ES(附加) 附加段是一个用来保存一些字符串指令的目标数据的附加数据段。
SS(堆栈) 堆栈段定义了堆栈使用的内存区域。堆栈的入口地址由堆栈段和堆栈指针寄存器决定,BP寄存器也可以在堆栈寄存器里寻址。
FS和GS 这两个段是80386-Pentium4 微处理器中提供的段来程序得到两个附加段。Windows 用它完成一些内部操作,对它们没有明确的定义。
0x01.2 分解寄存器
如果EAX=12345678,那么AX就是低四位(16bits)
对于EBX,有BX,BH和BL。对于ECX,几乎所有寄存器都有CX,CH和CL等。ESP仅具有16位的SP和8位的SL。
0x02 数据类型的大小
0x03 指令意义
mov dest,src 将源操作数的内容复制到目标
1. 常量到寄存器
2. 内存地址到寄存器
当要移动的值是内存地址时,OFFSET告诉我们必须使用该地址而不是其内容
3. 内存地址值到寄存器
当一个地址之前有单词OFFSET时,它表示该地址的数值。如果没有该单词,则表示该地址的内容
XCHG A, B 将A的值与B的值互换
LEA 加载有效地址
LEA A,B 指令LEA将指定的地址从B移动到A。它永远不会访问B的内容。它将始终是第二个操作数中括号内的操作的地址或结果。它经常用于获取变量和参数的内存地址
ADD A,B
它将值从B添加到A,并将结果保存在A中