![深度探索Go语言:对象模型与runtime的原理特性及应用](https://wfqqreader-1252317822.image.myqcloud.com/cover/582/47216582/b_47216582.jpg)
上QQ阅读APP看书,第一时间看更新
1.2.3 入栈和出栈指令
1.1节在介绍通用寄存器的时候,提到过ESP寄存器有特殊用途,被CPU用作栈指针。x86的一些指令虽然不直接以ESP为操作数,但是会隐式地修改ESP的值,例如入栈和出栈指令。
入栈指令PUSH只有一个操作数,即要入栈的源操作数。PUSH指令会先将ESP向下移动一个位置,然后把源操作数复制到ESP指向的内存处,代码如下:
![](https://epubservercos.yuewen.com/AE330E/26581160209140806/epubprivate/OEBPS/Images/Figure-P26_4657.jpg?sign=1738947360-x6BhEgdS1hQQ690T1OiP9i3vCkSkBL54-0-782d06f8e018d02b1c25b3592a6407ea)
等价于:
![](https://epubservercos.yuewen.com/AE330E/26581160209140806/epubprivate/OEBPS/Images/Figure-P26_4665.jpg?sign=1738947360-gZv8UtROedtR0Cj2WZP1Y2eWU16tZAdX-0-bf74fd85a719df04051a339e47a63fc8)
最后这个MOV指令把ESP用作基址进行寻址。
出栈指令POP也只有一个操作数,是用来接收数据的目的操作数。POP指令会先把ESP指向的内存处的值复制到目的操作数中,然后把ESP向上移动一个位置,代码如下:
![](https://epubservercos.yuewen.com/AE330E/26581160209140806/epubprivate/OEBPS/Images/Figure-P27_4675.jpg?sign=1738947360-PhlQs6YphiIh6D5hmRE3CXOea7H6USjw-0-a21ac3aa140f10ceb3c428b9da43f3e6)
等价于:
![](https://epubservercos.yuewen.com/AE330E/26581160209140806/epubprivate/OEBPS/Images/Figure-P27_4683.jpg?sign=1738947360-pbcpgDtR6ME6eHxcSh059FHjbHahCTEy-0-0b9a4af880f78fe88992860d53bedec5)