英特尔RFLAGS和POPFQ PUSHFQ?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了英特尔RFLAGS和POPFQ PUSHFQ?相关的知识,希望对你有一定的参考价值。

阅读EFLAGS,让我思考,64位标志寄存器怎么样?这个寄存器只有32位吗?我在网上看了,用RFLAGS扩展到了64位。我在英特尔指南中查了一下,它只是说,

RFLAGS以64位模式注册在64位模式下,EFLAGS扩展为64位,称为RFLAGS。 RFLAGS寄存器的高32位保留。 RFLAGS的低32位与EFLAGS相同。

然而,我不确定,“保留”意味着什么。有什么用RFLAGS?它是由英特尔内部使用的吗?文档似乎表明寄存器是64位,但是当PUSHFDPOPFD看起来是双字和四字时,有没有办法甚至与高32位进行交互。未来的处理器是否有可能提供PUSHFQPOPFQ

如果调用过程需要维护EFLAGS寄存器的状态,它可以使用PUSHF / PUSHFDPOPF / POPFD指令保存和恢复全部或部分寄存器。 PUSHF指令将EFLAGS寄存器的低位字推入堆栈,而PUSHFD指令则推送整个寄存器。 POPF指令从堆栈中弹出一个字到EFLAGS寄存器的低位字,而POPFD指令从堆栈中弹出一个双字到寄存器中。

答案

有时区分ISA(提供给程序员的架构)和内部实现(硅片中实际发生的事情)是有用的。就ISA而言,RFLAGS是一个64位寄存器(大多数位保留),就内部实现而言(理论上),不同的CPU可以做任何他们喜欢的事情,有些可能只实现24位寄存器,因为并不需要实现所有保留位。

请注意,当尺寸增加时,CPU制造商通常只会在现有寄存器上添加更多位。这意味着RFLAGS,EFLAGS和FLAGS是相同的寄存器;只是RFLAGS是整个寄存器,EFLAGS只是低32位,而FLAGS只是低16位。

对于RFLAGS(以及之前的EFLAGS和FLAGS); “reserved”表示它保留给未来的CPU。这意味着软件永远不应该设置这些位,软件不应该依赖这些位的值(这样,如果/当新的功能被添加到ISA并且这些位实际用于新的东西时,软件不会在未来的CPU上中断)。

自引入64位/长模式(现在约15年)以来,PUSHFQPOPFQ已经存在。

以上是关于英特尔RFLAGS和POPFQ PUSHFQ?的主要内容,如果未能解决你的问题,请参考以下文章

借助全新 MATLAB® 适配器代码示例读取英特尔® 实感? 摄像头数据流

为啥此代码段错误(在分配期间)与 pgi 而不是英特尔?

AI 帮忙找 Bug ,英特尔开源代码编程工具 ControlFlag

有没有人真的让 NVCC 和英特尔编译器一起工作?

Mac OS测试系统惊现AMD处理器代码,AMD YES

英特尔编译器未定义对符号“for_inquire”的引用