14

set $eflags不改变eflags价值。

例如,旧eflags值仍然存在。=>$set $eflag=0x243[这只是一个示例输入]。

或者,有没有办法设置单独的标志eflags

我正在寻找类似的东西:set ZF[zero flag]. 有没有一个 gdb 命令可以做到这一点?

4

4 回答 4

22

set $eflags没有括号在 GDB 7.7.1 中有效

要设置单个标志,请使用其索引。例如,ZF 是第 6 位,所以我们可以设置它:

set $ZF = 6                 # define a GDB variable: no effect on registers
set $eflags |= (1 << $ZF)   # set bit 6 in EFLAGS, the ZF bit.

所有其他按位运算也是如此:如何设置、清除和切换单个位?

# Clear
set $eflags &= ~(1 << $ZF)

# Toggle
set $eflags ^= (1 << $ZF)

造成混淆的原因是许多位要么被保留,不能被任何指令直接修改,要么不能从用户模式修改,另请参见:如何直接读写 x86 标志寄存器?所以 GDB 不会碰它们。

例如:

(gdb) set $eflags = 0
(gdb) i r eflags
eflags         0x202    [ IF ]
(gdb) set $eflags = 0xFFFFFFFF
(gdb) i r eflags
eflags         0x54fd7  [ CF PF AF ZF SF TF IF DF OF NT RF AC ]

0x202二进制是:

0010 0000 0010

0x54fd7二进制是:

0101  0100 1111 1101 0111

TODO 通过查看手册http://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures了解为什么设置了这些位中的每一个-software-developer-vol-1-manual.pdf和 GDB 源代码。

我理解的那些:

  • 所有保留的寄存器都保留在它们的固定值:1 表示第 1 位,0 表示第 3、5、15 和 22-31 位
于 2015-07-10T11:15:23.743 回答
7
set ($eflags)=0x243

在我的任何十六进制值的测试中工作。

于 2013-03-18T14:35:18.160 回答
0

eflags寄存器中设置所有标志是错误的。所以保留一些位,必须为 0。(3、5、15、22 和更大)位 1 必须为 1。也有rflags。但一切hi dword都是零。所以没有必要使用rflags代替eflags所有操作更改的标志。但我知道有些人使用免费位供自己使用。

比较适合rflags hi dword。因此,在 64 位架构中,有足够的空闲寄存器可供使用。但在 32 位架构中,没有。所以强烈建议这样做。

因为在未来的架构中可能会使用其中一些位。但是从 32 位到 64 位并没有触及这些标志。如果唯一的寄存器可能根本不会改变。因此,任何情况下的所有可能原因都已使用。我不认为在任何情况下可能会使用一些额外的标志直到现在才使用。这可能是对一些主要的处理器架构的改变。我不认为有些人会出于明显的原因决定这样做,所有软件都必须从一开始就被抛弃和重写。这是一项极其艰巨和艰巨的工作。

于 2017-11-05T00:27:12.683 回答
-1
eflags [ ZF ]

如果你想设置任意值使用这个

标志 0x42

于 2013-03-15T19:03:05.247 回答