首页 > 代码库 > 汇编笔记四【标识寄存器】 by:凉游浅笔深画眉 / Net7Cracker

汇编笔记四【标识寄存器】 by:凉游浅笔深画眉 / Net7Cracker

一、push xxxxx指令和ESP的关系

  ESP的值,是由Push指令后面的操作数的宽度决定的。也就是xxxxx的宽度,假如Puh后面跟的是一个立即数,由于整数是四字节,所以esp-4。

  假如Push 后面跟的是容器,那么就看这个容器的宽度。

  例:假如目前ESP的值是FFFFFFFF

    当PUSH 1 这条指令执行后,ESP=FFFFFFFB,因为1是个立即数,只要Push后面是立即数,那么ESP的值就会减4

  例:假如目前ESP的值是FFFFFFFF

    当PUSH ax 这条指令执行后,ESP=FFFFFFFD,因为AX是个寄存器,该寄存器一共是16位,也就是2个字节,所以ESP的值就会减2

  例:假如目前ESP的值是FFFFFFFF

    当PUSH eax 这条指令执行后,ESP=FFFFFFFB,因为EAX是个寄存器,该寄存器一共是32位,也就是4个字节,所以ESP的值就会减4

  例:假如目前ESP的值是FFFFFFFF

    当PUSH DWORD PTR DS:[XXXXXX] 这条指令执行后,ESP=FFFFFFFB,因为DWORD宽度为4个字节,所以ESP的值就会减4

  例:假如目前ESP的值是FFFFFFFF

    当PUSH WORD PTR DS:[XXXXXX] 这条指令执行后,ESP=FFFFFFFD,因为DWORD宽度为2个字节,所以ESP的值就会减2

 

二、PUSHAD指令

  PUSHAD指令压入32位寄存器,其入栈顺序是:EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI .

      也就是将8个通用寄存器EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI 全部压入堆栈,作用是保护堆栈。

  当你执行完毕PUSHAD指令后,可以对寄存器进行任意操作,操作完毕后,只需要再执行POPAD指令,即可还原刚才压入的8个通用寄存器的值。

汇编笔记四【标识寄存器】 by:凉游浅笔深画眉 / Net7Cracker