关于RFLAGS寄存器32-63位的内部描述及读写特性的技术问询
关于RFLAGS寄存器32-63位的内部描述及读写特性的技术问询
我特意翻遍了英特尔官方手册,但确实找不到关于RFLAGS寄存器32-63位的内部说明文档。
我在64位模式下做了个Godbolt测试,运行后输出了当前RFLAGS寄存器的完整状态,结果显示32-63位全部为0,具体各位的状态如下:
- Bit 0 - 进位标志(CF):0
- Bit 1 - 保留位,在EFLAGS中始终为1:1
- Bit 2 - 奇偶标志(PF):0
- Bit 3 - 保留位:0
- Bit 4 - 辅助进位标志(AF):0
- Bit 5 - 保留位:0
- Bit 6 - 零标志(ZF):0
- Bit 7 - 符号标志(SF):0
- Bit 8 - 陷阱标志(TF):0
- Bit 9 - 中断允许标志(IF):1
- Bit 10 - 方向标志(DF):0
- Bit 11 - 溢出标志(OF):0
- Bit 12 - I/O特权级(IOPL)- 低位:0
- Bit 13 - I/O特权级(IOPL)- 高位:0
- Bit 14 - 嵌套任务标志(NT):0
- Bit 15 - 模式标志(MD)- 保留位:0
- Bit 16 - 恢复标志(RF):0
- Bit 17 - 虚拟8086模式标志(VM):0
- Bit 18 - 对齐检查/访问控制标志(AC):0
- Bit 19 - 虚拟中断标志(VIF):0
- Bit 20 - 虚拟中断挂起标志(VIP):0
- Bit 21 - ID标志(ID):0
- Bit 22~31 - 保留位/特定功能位:全部为0
- Bit 32~63 - 保留位:全部为0
接下来我做了手动修改RFLAGS的测试,操作代码如下:
pushfq pop rax ; rax = 202 xor rax,0FFFFFFFFCAFEBABEh push rax ; rax = ffffffffcafeb8bc popfq pushfq pop rax ; rax = 200a96
测试结果很明确:执行popfq指令后,RFLAGS的低32位被成功修改(还导致了程序出现异常行为),但高32位的保留位完全没受影响。
结合测试和相关结论,这里可以确定:
这些高32位属于保留位,始终为0。即使尝试往里面写入1,目前也会被处理器忽略——它们依然保持为0。
备注:内容来源于stack exchange,提问作者vengy
相关产品推荐
相关产品推荐

