![深度探索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=1739253614-KSd56Wyvg3Wn6HyRoKpSzz6xgRyN8Bh2-0-de927cfb394f9eee3a8e18bf46091229)
等价于:
![](https://epubservercos.yuewen.com/AE330E/26581160209140806/epubprivate/OEBPS/Images/Figure-P26_4665.jpg?sign=1739253614-bs71WcuirvofhAiVCk3gNFUxtVGhNrrN-0-f836b1b2e7d39f09794172df1e4d5bd5)
最后这个MOV指令把ESP用作基址进行寻址。
出栈指令POP也只有一个操作数,是用来接收数据的目的操作数。POP指令会先把ESP指向的内存处的值复制到目的操作数中,然后把ESP向上移动一个位置,代码如下:
![](https://epubservercos.yuewen.com/AE330E/26581160209140806/epubprivate/OEBPS/Images/Figure-P27_4675.jpg?sign=1739253614-rRYbOHj9uSn4oIeEKD8QBL7fz40TKJTi-0-b16c83d8ddf655f5a8ee4e429c000d50)
等价于:
![](https://epubservercos.yuewen.com/AE330E/26581160209140806/epubprivate/OEBPS/Images/Figure-P27_4683.jpg?sign=1739253614-llF3zkoqIF7aSBjVZYsgZa2YX7sPt1xp-0-478b3897c0260b1b90625fbc41c73ddc)