首页 > 代码库 > 汇编笔记四【标识寄存器】 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