根据《英特尔®64和IA-32架构软件开发人员手册》第2卷,pop fs
支持3个变体(pop gs
也一样):
AMD64文档op pop
没有明确描述堆栈指针发生了什么。我试图产生这些,似乎气体确实可以识别它们(我假设它们需要66h前缀):
80490d6: 0f a1 pop fs
80490d8: 66 0f a1 popw fs
80490db: 0f a9 pop gs
80490dd: 66 0f a9 popw gs
我为这些而伤脑筋。据我了解,FS和GS寄存器为16位,我知道它们具有隐藏部分,但是我不期望pop
指令能够操纵那些寄存器吗?有人可以解释这些变体的目的是什么吗?
在32位模式下,每个堆栈插槽均为32位。如果在压入段寄存器之后必须将堆栈指针调整为4字节的倍数,那会很烦人,因此CPU提供了将段寄存器压入4字节堆栈插槽的指令。
当段寄存器以操作数大小32位压入时,寄存器内容零扩展为dword。当它弹出时,只有低两个字节被读入段寄存器。高字节再次被忽略。