【问题标题】:In x86 32 bit protected mode, can we still use SP rather than ESP register when use PUSH/POP instructions?在 x86 32 位保护模式下,当使用 PUSH/POP 指令时,我们仍然可以使用 SP 而不是 ESP 寄存器吗?
【发布时间】:2021-03-31 14:17:49
【问题描述】:

不知道什么时候用SP寄存器,什么时候用ESP寄存器,另外我想知道什么时候用ESP寄存器,是不是一直减4,不能减2?

【问题讨论】:

  • 您是在问您是否应该正常(否),或者是否有可能让硬件做到这一点? (是)

标签: assembly x86 protected-mode


【解决方案1】:

从技术上讲,SP 可以在 32 位模式下用于 pushpop,但它需要修改通常无法更改的标志。

在 pmode 中使用 SP 还是 ESP 由 SS 引用的段描述符中的 B 标志控制。通常在用户模式代码中,这不是您可以访问的内容,因此您无法更改它。

默认操作数大小有类似但独立的机制,默认地址大小(和栈地址大小一样,纯地址大小用于@987654325的内存操作数@ 和 pop [mem])。这是 3 个不同的东西,见下文。

使用ESP寄存器时,是否总是减4,不能减2

推送/弹出word 是可能的,甚至很容易,即使在 64 位模式下也是如此。为此,您只需要操作数大小覆盖前缀 66h。例如push dx 在 32 位甚至 64 位模式下都是绝对可编码的(尽管我不推荐使用它)。这与使用 SP 或 ESP 无关。

所以有三种不同的尺寸在起作用,其中两种有一个覆盖前缀可以改变它:

  1. 操作数大小,推入worddword,这决定堆栈指针是移动2 还是4。通常在32 位模式下,默认大小将设置为32 位,但操作数大小覆盖前缀可用于在 32 位模式下(甚至在 64 位模式下)编码push dx
  2. 地址大小,用于具有显式内存操作数的pushpop,而不是用于隐式堆栈位置。地址大小覆盖前缀可用于编码例如push dword [bx],两个前缀可一起用于编码push word [bx]。在 64 位模式下,地址大小覆盖前缀会导致地址被解释为 32 位地址,而不是 16 位地址,因此push qword [bx] 是不可能的。
  3. 堆栈地址大小,仅由堆栈段描述符中的B标志决定,没有覆盖前缀。

【讨论】:

猜你喜欢
  • 2011-10-18
  • 2012-09-12
  • 1970-01-01
  • 2016-11-13
  • 2017-09-12
  • 2012-08-15
  • 2013-11-22
  • 2019-10-30
相关资源
最近更新 更多