- 1.CPU寄存器
- 2.常用汇编指令
- 3.作者答疑
ESP是栈指针寄存器(extended stack pointer),其内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的栈顶。是cpu机制决定的,push、pop指令会自动调整esp的值。 EBP是基址指针寄存器(extended base pointer),一般与ESP配合使用,可以存取某时刻的ESP,这个时刻就是进入一个函数内后,cpu会将ESP的值赋给EBP,此时就可以通过EBP对栈进行操作,比如获取函数参数,局部变量等。其内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的底部。 win32系统会分配一个向下扩展,入栈,地址减小,出栈,地址增加,足够大的栈段保存栈数据。 调用一个函数时,先将堆栈原先的基址(EBP)入栈,以保存之前任务的信息。然后将栈顶指针的值赋给EBP,将之前的栈顶作为新的基址(栈底),然后再这个基址上开辟相应的空间用作被调用函数的堆栈。函数返回后,从EBP中可取出之前的ESP值,使栈顶恢复函数调用前的位置;再从恢复后的栈顶可弹出之前的EBP值,因为这个值在函数调用前一步被压入堆栈。这样,EBP和ESP就都恢复了调用前的位置,堆栈恢复函数调用前的状态。 EAX (Extended Accumulator):累加寄存器,也称之为累加器; EBX (Extended Base):基地址寄存器; ECX (Extended Count):计数器寄存器; EDX (Extended Data):数据寄存器; ESI 和 EDI 又称作为变址寄存器:ESI (Source Index):源变址寄存器;EDI (Destination Index):目的变址寄存器。控制寄存器:EIP (Extended Instruction Pointer):指令指针寄存器;EFLAG:标志寄存器;段寄存器:CS (Code Segment):代码段寄存器;DS (Data Segment):数据段寄存器;SS (Stack Segment):堆栈段寄存器;ES (Extra Segment):附加段寄存器。 【注意】 4个通用数据寄存器是可拆分的,例如 AX可分为AH(高位寄存器)和AL(低位寄存器),如下图所示: CS:IP索引的内存地址即为CPU开始读取代码的起点,之后的一段代码区域,被称为代码片段(code segement),这两个寄存器不能进行赋值操作(mov操作),只能通过jum汇编指令跳转。
在32位模式下:当使用平坦(未分段的)存储器模型时,段寄存器加载的段选择符指向重叠的段,在线性地址空间中,每个段的起始地址都是0。这些重叠的段构成了程序可见的线性地址空间。通常,会定义两个重叠的段:一个是代码段,另一个是数据/栈段。CS寄存器指向代码段;其他的所有段寄存器指向数据/栈段。 在64位模式下:处理器把CS/DS/ES/SS的段基都当作0,忽略与之关联的段描述符中的段基地址。这样就为代码/数据/栈创建了平坦的地址空间。但是FS/GS段寄存器是例外。在计算线性地址时,这两个段寄存器可能被用作额外的基址寄存器(当寻址局部数据或寻址某些操作系统数据结构时)。
2.常用汇编指令push指令:它首先减少 ESP 的值,再将源操作数复制到堆栈地址。操作数是 16 位的,则 ESP 减 2,操作数是 32 位的,则 ESP 减 4。 pop指令:它首先把 ESP 指向的堆栈元素内容复制到一个 16 位或 32 位目的操作数中,再增加 ESP 的值。如果操作数是 16 位的,ESP 加 2,如果操作数是 32 位的,ESP 加 4。 pushfd指令:它把 32 位 EFLAGS 寄存器内容压入堆栈,而 popfd指令则把栈顶单元内容弹出到 EFLAGS 寄存器。 lea指令:取有效地址指令 (Load Effective Address ),指令格式:LEA 目的,源;指令功能:取源操作数地址的偏移量,并把它传送到目的操作数所在的单元。LEA 指令要求源操作数必须是存储单元,而且目的操作数必须是一个除段寄存器之外的16位或32位寄存器。当目的操作数是16位通用寄存器时,那么只装入有效地址的低16位。 中括号:[地址] 是取地址指向的内容。 stosd:将eax的内容复制到edi的内存空间,复制四个字节,并将edi加4。 rep指令:重复后面的指令。ECX的值是重复的次数。初始化edi,设置好ecx,初始化eax,初始化内存,如下源代码所示:
lea edi,dword ptr ss:[ebp-1F4]
mov ecx,7D
mov eax,CCCCCCCC
rep stosd
FLD指令:格式,FLD STReg/MemReal,指令功能:将浮点数据压入协处理器的堆栈中。当进行内存单元内容压栈时,系统会自动决定传送数据的精度。 FST指令:格式,FST STReg/MemReal,指令功能:将协处理器堆栈栈顶的数据传送到目标操作数中。在进行数据传送时,系统自动根据控制寄存器中舍入控制位的设置把栈顶浮点数舍入成相应精度的数据。 neg指令:格式,Neg Reg/MemReal,指令功能:操作数取补。 jl指令:前面进行的算术运算,小于则跳转。 ffree指令:浮点释放。 fincstp指令:浮点栈针加一。 MOVZX 指令:MOVZX OPD,OPS,将8位或16位的OPS零扩展为16位或32位,再传给OPD。 test指令:属于逻辑运算指令,功能: 执行BIT与BIT之间的逻辑运算,测试(两操作数作与运算,仅修改标志位,不回送结果)。Test对两个参数(目标,源)执行AND逻辑操作,并根据结果设置标志寄存器,结果本身不会保存。 CMP指令:属于算术运算指令,两操作数作减法,仅修改标志位,不回送结果。
3.作者答疑如有疑问,敬请留言。