【问题标题】:How to change the eflags register value in GDB?如何更改 GDB 中的 eflags 寄存器值?
【发布时间】:2013-03-04 14:59:53
【问题描述】:

set $eflags 不会更改 eflags 的值。

旧的eflags 值保留在例如之后。 =>$set $eflag=0x243 [这只是一个示例输入]。

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

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

【问题讨论】:

  • eflags [ ZF ] 应该这样做..
  • 我得到“未定义的命令:“eflags”。试试“帮助”。带有“eflags [ZF]”。你能举个这个命令的例子吗?

标签: debugging assembly gdb flags


【解决方案1】:

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.

所有其他按位运算也是如此:How do you set, clear, and toggle a single bit?

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

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

导致混淆的原因是许多位要么被保留,不能被任何指令直接修改,要么不能从用户模式修改,另请参见:How to read and write x86 flags registers directly?,因此 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

【讨论】:

  • set $eflags |= (1
  • @user3364161 只是为了避免代码中出现魔术常量,并自动记录它们的含义。当然,ZF=6 也可以。
【解决方案2】:

eflags 寄存器中设置所有标志是错误的。所以保留了一些位,必须为 0。(3、5、15、22 和更大)位 1 必须为 1。还有rflags。但是所有hi dword 都是零。因此对于所有操作更改的标志,无需使用rflags 而不是eflags。但我知道有些人将免费位用于自己的用途。

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

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

【讨论】:

  • 原发帖人并没有说要设置所有位,而是要设置特定的位或组(他们以0x243为例)。他们想要一种干净的方式来设置单独的标志。
【解决方案3】:
set ($eflags)=0x243

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

【讨论】:

【解决方案4】:
eflags [ ZF ]

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

eflags 0x42

【讨论】:

  • 使用set ($eflags)|=0x42 设置ZF。经过测试。
猜你喜欢
  • 2023-03-07
  • 1970-01-01
  • 2011-07-22
  • 2020-11-04
  • 1970-01-01
  • 2012-10-28
  • 2012-05-06
  • 2013-11-02
  • 2021-01-21
相关资源
最近更新 更多