2017-05-08 64 views
1

有些教程说EFLAGS寄存器是通用寄存器,而其他教程则说它不是通用寄存器。EFLAGS是通用寄存器吗?

那么哪一个呢?

+5

这不是一个通用的注册表。它实际上是一个状态寄存器。 –

+0

https://en.wikipedia.org/wiki/FLAGS_register –

回答

1

它们不是通用寄存器。而是, “程序状态和控制寄存器” 作为Intel's Documentation,卷A:enter image description here

+1

我甚至会说“ESP”不是“通用寄存器”,因为它必须**指向堆栈。 –

+3

@MartinRosenau,不,它不会,RSP可以指向任何东西。应用程序可以选择放弃使用堆栈。如果是这样,您可以将RSP用于任何您喜欢的目的。 – Johan

+0

@Johan“通用”一词意味着某物可用于任何目的。事实上,当CPL = 3时,ESP寄存器可能有任何值 - 但只有当您不使用“call”或“push”指令时!但是,当CPL = 0时,ESP必须指向堆栈:如果发生任何中断,ESP寄存器中的无效值(例如指向非映射地址)肯定会导致CPU因“三重故障”而复位! (例如NMI。)这就是为什么我说ESP不是一个“通用目的”寄存器。 –

3

没有,

It is not because

  • 您无法直接解决这个问题;没有MOV EFLAGS, Value指令。
  • 您无法使用EFLAGS执行计算。
  • 无法在任何指令中指定EFLAGS作为显式源或目标。

事实上,只有4个指令,让您解决eflags寄存器作为一个整体:PUSHFPOPFSAHF,并且LAHF 甚至这些指令只在寄存器中的一组有限的比特的作用。

其实eflags是远离通用寄存器,你可以得到。这是一个特殊用途的状态寄存器。