【问题标题】:Pushing differently-sized registers to the stack将不同大小的寄存器压入堆栈
【发布时间】:2012-07-21 04:49:18
【问题描述】:

查看Intel's Instruction Set Reference 时,我注意到用于推送16、32 和64 位寄存器的操作码是相同的(分别为50+rw50+rd50+rd)。

如果所有操作码都相同,处理器如何知道它需要将哪个寄存器压入堆栈?如果取决于当前的操作模式,那么如果你在保护模式下压入axeax的高16位是否也压入堆栈?

【问题讨论】:

    标签: assembly x86 stack


    【解决方案1】:

    你的假设有点偏差(我不怪你,英特尔的手册有时会非常非常神秘),是的,它们可能具有相同的 base 操作码,但不同于 32 的大小需要一个大小覆盖前缀,例如:

    66:50 PUSH AX
    50    PUSH EAX
    

    在这里我们可以看到在PUSH'ing AX 时使用了 16 bix 大小覆盖前缀 0x66

    这是您无法推送字节寄存器的原因之一,因为没有可用的大小覆盖前缀来执行此操作。

    【讨论】:

      猜你喜欢
      • 2012-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多