2013-03-15 103 views
6

set $eflags不会更改eflags值。如何更改GDB中的eflags寄存器值?

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

另外,有没有办法设置eflags个人标志?

我在寻找一个像:set ZF[zero flag]。有没有一个gdb命令来做到这一点?

+1

eflags [ZF]应该做.. – 2013-03-18 14:29:05

+2

我得到了“未定义的命令:”eflags“,试试”帮助“。与“eflags [ZF]”。你能举一个这个命令的例子吗? – snakeninny 2014-01-16 02:23:54

回答

6
set ($eflags)=0x243 

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

+0

在GDB 7.7.1中,括号似乎不是必需的:http://stackoverflow.com/a/31339372/895245 – 2015-07-10 11:15:59

0
eflags [ ZF ] 

如果你想设置的任意值,使用该

EFLAGS的0x42

+4

我收到了'未定义的命令:“eflags”。尝试“帮助”。 – Saphrosit 2014-03-29 11:55:13

+3

使用'set($ eflags)| = 0x42'设置[ZF](http://en.wikipedia.org/wiki/Zero_flag)。测试。 – 2015-02-08 19:35:39

9

set $eflags没有括号工作在GDB 7.7.1

要设置一个单独的标志,使用它的索引。例如,ZF是第6位,因此我们可以将其设置:

set $ZF = 6 
set $eflags |= (1 << $ZF) 

这同样适用于其他所有位运算:How do you set, clear, and toggle a single bit?

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

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

是什么原因导致的困惑是,有多少位被保留,不能通过任何指令直接修改,或不能从用户模式修改,另请参阅:Flags registers - Can we read or write them 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
+0

set $ eflags | =(1 << $ ZF)命令的作用是什么?为什么设置$ ZF = 6还不够? – user3364161 2017-05-11 17:50:44

+0

@ user3364161只是为了避免代码中的魔术常数,并自动记录它们的含义。 ZF = 6当然也可以。 – 2017-05-12 04:09:05

0

这是在eflags寄存器中设置所有标志错误。所以一些位保留并且必须是0.(3,5,15,22和更大)位1必须是1.还有rflags。但是,所有喜的dword是零。所以没有必要为所有操作改变的标志使用rflags而不是eflags。但我认识那些使用自由位的人们。更合适的rflags嗨dword。所以在64位体系结构中使用足够的免费寄存器。但在32位拱门号码。所以强烈建议这样做。 因为将来可能会使用这些位。但是这个标志没有触及形式改变32位的拱到64.它唯一的寄存器可能根本没有改变。因此,所有可能的理由已经被使用。我不认为任何情况下可能会使用一些额外的标志不会被使用到现在。这可能会导致某些主要处理器体系结构发生变化。我不认为有些人会因为显而易见的原因决定这么做,所以软件必须从一开始就被抛出并重写。这是非常困难和巨大的工作...

+1

这个答案可以使用一些段落和'back-ticks' – GiantsLoveDeathMetal 2017-11-05 00:33:50

+0

原始海报没有说他们想要设置所有的位,但是特定的或者一组(他们给出了0x243作为例子)。他们想要一个干净的方式来设置各个标志。 – 2017-11-05 00:41:31