
上QQ阅读APP看书,第一时间看更新
1.2.3 入栈和出栈指令
1.1节在介绍通用寄存器的时候,提到过ESP寄存器有特殊用途,被CPU用作栈指针。x86的一些指令虽然不直接以ESP为操作数,但是会隐式地修改ESP的值,例如入栈和出栈指令。
入栈指令PUSH只有一个操作数,即要入栈的源操作数。PUSH指令会先将ESP向下移动一个位置,然后把源操作数复制到ESP指向的内存处,代码如下:

等价于:

最后这个MOV指令把ESP用作基址进行寻址。
出栈指令POP也只有一个操作数,是用来接收数据的目的操作数。POP指令会先把ESP指向的内存处的值复制到目的操作数中,然后把ESP向上移动一个位置,代码如下:

等价于:
