SDM指令功能描述(PUSHF/PUSHFD/PUSHFQ)
总体描述:
根据操作数宽度的不同:
32:
栈指针递减4,然后压入eflags寄存器的值
16:
栈指针递减2,然后压入eflags的低16位
64:
栈指针递减8,然后压入rflags寄存器的值
当把eflags复制到栈顶的时候,VM(bit16)和RF(bit17)位不会被复制,而 会用 0填充
**在虚8086模式下且I/O等级小于3,那么pushf/pushfd会触发GP异常
在实模式下 当ESP或SP的值是1的时候pushf/pushfd指令会触发SS异常**
伪代码:
if((PE==0) or (PE==1 and (VM==0 and IOPL==3)))
/* 实地址模式,保护模式,或虚8086模式且iopl等于3 */
{
if(操作数宽度==32)
{
push(EFLAGS & 0x00fcffff)
}
else(操作数宽度==16)
{
push(EFLAGS的低16位)
}
}
else if(64bit mode)
{
if(操作数宽度==64)
{
push(rflags & 0x0000000000fcffff)
}
else
{
push(EFLAGS的低16位)
}
}
else(在虚8086模式下且iopl小于3)
{
#GP
}
本文详细解析了X86架构下的PUSHF/PUSHFD/PUSHFQ指令,介绍了不同操作数宽度下的栈指针变化及eflags/rflags寄存器的压栈过程。在虚8086模式和某些特定情况下,这些指令可能会触发异常。
2922

被折叠的 条评论
为什么被折叠?



