为什么PUSHAD指令存储ESP?

时间:2014-12-03 04:16:15

标签: assembly x86 hardware

为什么PUSHAD指令费心去存储ESP?如果我想使用POPAD来恢复ESP,我必须在使用POPAD之前知道ESP的正确内容。将ESP存放在PUSHAD似乎毫无用处。

有人可以提供一些解释吗?感谢。

1 个答案:

答案 0 :(得分:2)

根据我的研究,PUSHA指令于1982年在处理器Wikipedia: Intel 80286中引入。

文件"Intel 80286 Programmer's Reference Manual 1987"使用文字解释了它的目的:

  

... PUSHA(推送所有寄存器)保存八个一般的内容   在堆栈上注册...这条指令简化了   通过减少保留所需的指令数来调用过程   用于程序的通用寄存器的内容。 PUSHA是   POPA补充......

     

... POPA(弹出所有寄存器)弹出上面描述中给出的八个通用寄存器,   除了丢弃SP值而不是加载到SP中。 POPA   反转先前的PUSHA,将通用寄存器恢复为其值   在PUSHA被执行之前......

     

...中断服务程序可能会影响除其他IP,CS以外的寄存器,   和旗帜。保存中断例程是一个责任   继续之前的附加上下文信息,以便状态   完成中断服务程序后,可以恢复机器   (PUSHA和POPA说明适用于这些操作)。最后,   执行IRET指令会弹出旧的IP,CS和FLAGS   堆叠并恢复被中断程序的执行...

     

......通常,系统设计人员可以自由使用几乎任何中断向量   出于任何特定目的。然而,一些编号最小的矢量是   英特尔保留用于专用功能;他们的使用是特别暗示的   通过某些类型的例外。前32个载体都不应该是   由用户定义;这些向量可以通过预定义来调用   英特尔未来扩展的例外或保留......

我的松散翻译是,它应该是一种简单的方法,可以在某个时间点创建处理器“状态”的快照,以便可以通过异常处理程序和适当的纠正措施进行检查。检查呼叫者的堆栈帧是可能需要的事情之一。

一旦做出这个设计决定,如果实际上已经修复并冻结到今天,因为“完全向后兼容的指令集”是x86架构的典型特征(参见Wikipedia: x86,{{ 3}})


  

delphifirst:为什么PUSHAD指令费心存储ESP?

它做到了。期。为什么30年前的工程师决定...现在是毫无意义的问题,对现今程序员的编程决策没有影响