在x86 32位保护模式下,当使用PUSH/POP指令时,我们还能使用SP而不是ESP寄存器吗



我不知道什么时候用SP寄存器,什么时候用ESP寄存器,另外,我想知道什么时候使用ESP寄存器,它总是减4而不能减2吗?

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

在pmode中使用SP还是ESP由SS引用的段描述符中的B标志决定。通常在用户模式代码中,这不是你可以访问的东西,所以你不能更改它

默认操作数大小和默认地址大小有类似但独立的机制(不是与堆栈地址大小相同,普通地址大小用于push [mem]pop [mem]的内存操作数(。这是三件独立的事情,见下文。

当使用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标志决定,没有覆盖前缀

相关内容

最新更新