为什么PUSHAD指令费心去存储ESP?如果我想使用POPAD来恢复ESP,我必须在使用POPAD之前知道ESP的正确内容。将ESP存放在PUSHAD似乎毫无用处。
有人可以提供一些解释吗?感谢。
答案 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年前的工程师决定...现在是毫无意义的问题,对现今程序员的编程决策没有影响