Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Debugging 如何更改GDB中的eflags寄存器值?_Debugging_Assembly_Gdb_Flags - Fatal编程技术网

Debugging 如何更改GDB中的eflags寄存器值?

Debugging 如何更改GDB中的eflags寄存器值?,debugging,assembly,gdb,flags,Debugging,Assembly,Gdb,Flags,set$eflags不会更改eflags值 旧的eflags值保留在后面,例如,=>$set$eflag=0x243[这只是一个示例输入] 或者,是否有任何方法可以设置eflags的各个标志 我正在寻找类似的东西:set ZF[zero flag]。是否有gdb命令来执行此操作 eflags [ ZF ] 如果要设置任意值,请使用此 eflags 0x42 set ($eflags)=0x243 在我的测试中使用了任何十六进制值。设置$eflags不带括号在GDB 7.7.1中使用 要设置单

set$eflags
不会更改
eflags

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

或者,是否有任何方法可以设置
eflags
的各个标志

我正在寻找类似的东西:
set ZF[zero flag]
。是否有gdb命令来执行此操作

eflags [ ZF ]
如果要设置任意值,请使用此

eflags 0x42

set ($eflags)=0x243

在我的测试中使用了任何十六进制值。

设置$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.
二进制格式的
0x202
是:

0010 0000 0010
0101  0100 1111 1101 0111
二进制格式的
0x54fd7
是:

0010 0000 0010
0101  0100 1111 1101 0111
通过查看手册和GDB源代码,了解为什么要设置这些位或不设置这些位

据我所知:

  • 所有保留寄存器都保持其固定值:1表示位1,0表示位3、5、15和22-31

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

      更适合dword格式的
      rflags。因此,在64位体系结构中,可以使用足够的空闲寄存器。但在32位体系结构中,没有。因此强烈建议这样做


      因为在未来的架构中,可能会使用其中的一些位。但是,从32位更改为64位时不会触及这些标志。如果是唯一一个可能根本不会更改的寄存器。因此,所有可能的原因,任何情况下已经使用。我不认为有任何情况可能会被使用一些额外的标志直到现在才被使用。这可能是因为处理器架构发生了一些重大变化。我不认为有些人决定这么做是因为显而易见的原因,所有的软件必须从一开始就被扔掉并重写。这是一项极其艰巨的工作。

      eflags[ZF]应该可以。我得到了“未定义的命令:”eflags“。请尝试“帮助”。“使用eflags[ZF]”。您能给出此命令的示例吗?使用
      set($eflags)|=0x42
      进行设置。经过测试。在GDB 7.7.1中,括号似乎不是必需的:设置$eflags |=(1@user3364161只是为了避免代码中的神奇常数,并且自动记录它们的含义。ZF=6当然也可以。原始海报没有说他们想要设置所有位,而是特定位或一组(他们给出了0x243作为示例).他们想要一种干净的方式来设置单独的旗帜。