i386 / x64 pop FS / GS指令支持一种变体,它将SP增加32位或64位而不是16位。它是做什么用的?

问题描述 投票:1回答:1

根据《英特尔®64和IA-32架构软件开发人员手册》第2卷,pop fs支持3个变体(pop gs也一样):

  • 将栈顶弹出FS;将堆栈指针递增16位。
  • 将栈顶弹出FS;将堆栈指针增加32位。 (在兼容/腿式模式下可用)
  • 将栈顶弹出FS;将堆栈指针递增64位。 (在64位模式下可用)

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指令能够操纵那些寄存器吗?有人可以解释这些变体的目的是什么吗?

assembly x86 x86-64 i386
1个回答
0
投票

在32位模式下,每个堆栈插槽均为32位。如果在压入段寄存器之后必须将堆栈指针调整为4字节的倍数,那会很烦人,因此CPU提供了将段寄存器压入4字节堆栈插槽的指令。

当段寄存器以操作数大小32位压入时,寄存器内容零扩展为dword。当它弹出时,只有低两个字节被读入段寄存器。高字节再次被忽略。

© www.soinside.com 2019 - 2024. All rights reserved.