【发布时间】:2012-03-07 23:00:08
【问题描述】:
我知道 pushad 将所有 32 位寄存器推入堆栈,但最终存储在堆栈中的唯一寄存器是 EDI。标志值不受影响,那么使用 pushad 有什么意义呢?此外,我知道 pushfd 以双精度格式推送所有标志值。那么,如果 flag 值通常只有 0 或 1,pushfd 操作如何将 00000A46 等值压入堆栈?
【问题讨论】:
-
“最终存储在堆栈中的唯一寄存器是 EDI” - 您是如何得出这个结论的?
-
不知道你从哪里得到的。您在 16 位代码中使用 pusha 和 pushf,在 32 位代码中使用 pushad 和 pushfd。 A46 有 12 位。
-
这个问题毫无意义。 EDI位不正确,请解释一下。标志不受什么影响?什么是“双重格式”?您是在谈论标志还是 EFLAGS 寄存器?另外,我们是 32 位还是 16 位代码?等等。
-
EDI 是加载到堆栈中的最后一个寄存器,如果您在 x86 汇编中使用过它,它是唯一存储在堆栈中的值。
-
@user1210446 你的误解来自于
pusha在每次写入堆栈之间递减esp,因此所有压入的寄存器最终都位于不同的地址。
标签: assembly x86 32bit-64bit