【发布时间】:2021-03-31 14:17:49
【问题描述】:
不知道什么时候用SP寄存器,什么时候用ESP寄存器,另外我想知道什么时候用ESP寄存器,是不是一直减4,不能减2?
【问题讨论】:
-
您是在问您是否应该正常(否),或者是否有可能让硬件做到这一点? (是)
标签: assembly x86 protected-mode
不知道什么时候用SP寄存器,什么时候用ESP寄存器,另外我想知道什么时候用ESP寄存器,是不是一直减4,不能减2?
【问题讨论】:
标签: assembly x86 protected-mode
从技术上讲,SP 可以在 32 位模式下用于 push 和 pop,但它需要修改通常无法更改的标志。
在 pmode 中使用 SP 还是 ESP 由 SS 引用的段描述符中的 B 标志控制。通常在用户模式代码中,这不是您可以访问的内容,因此您无法更改它。
默认操作数大小有类似但独立的机制,默认地址大小(不和栈地址大小一样,纯地址大小用于@987654325的内存操作数@ 和 pop [mem])。这是 3 个不同的东西,见下文。
使用ESP寄存器时,是否总是减4,不能减2
推送/弹出word 是可能的,甚至很容易,即使在 64 位模式下也是如此。为此,您只需要操作数大小覆盖前缀 66h。例如push dx 在 32 位甚至 64 位模式下都是绝对可编码的(尽管我不推荐使用它)。这与使用 SP 或 ESP 无关。
所以有三种不同的尺寸在起作用,其中两种有一个覆盖前缀可以改变它:
word 或dword,这决定堆栈指针是移动2 还是4。通常在32 位模式下,默认大小将设置为32 位,但操作数大小覆盖前缀可用于在 32 位模式下(甚至在 64 位模式下)编码push dx。push 和pop,而不是用于隐式堆栈位置。地址大小覆盖前缀可用于编码例如push dword [bx],两个前缀可一起用于编码push word [bx]。在 64 位模式下,地址大小覆盖前缀会导致地址被解释为 32 位地址,而不是 16 位地址,因此push qword [bx] 是不可能的。【讨论】: