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作为示例).他们想要一种干净的方式来设置单独的旗帜。