set $eflags不更改eflags值。
在eg之后,旧的eflags值仍然保持不变。=>$set $eflag=0x243 --这只是一个示例输入。
或者,是否有任何方式设置eflags的单个标志?
我在找类似的东西:set ZF[zero flag]。有一个gdb命令来完成这个任务吗?
发布于 2013-03-18 14:35:18
set ($eflags)=0x243在我的测试中为任何十六进制值工作过。
发布于 2015-07-10 11:15:23
没有括号的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.或者直接:
set $eflags |= (1 << 6) 所有其他按位操作也是如此: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通过查看手动http://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-software-developer-vol-1-manual.pdf和GDB源代码,TODO理解了为什么设置了这些位。
我理解的是:
发布于 2017-11-05 00:27:12
在eflags寄存器中设置所有标志是错误的。所以有些位是保留的,必须是0。(3,5,15,22及更高)位1必须是1。还有rflags。但是所有的hi dword都是零。因此,对于所有更改的操作,不需要使用rflags而不是eflags。但我知道有些人会用免费的比特来自用。
比较合适的rflags hi dword。因此,在64位结构中,有足够的空闲寄存器来使用。但在32位架构中,没有。所以强烈建议这么做。
因为在未来的体系结构中,可能会使用其中的一些比特。但是,这些标志不会从32位更改为64位。如果唯一可以完全不更改的寄存器。所以所有可能的理由都已经用过了。我不认为任何情况下可能会使用一些额外的标志,直到现在才使用。它可能是对某些主要处理器架构的改变。我不认为有些人决定这么做是因为显而易见的原因,所有的软必须从一开始就被丢弃和重写。这是一项艰巨而艰巨的工作。
https://stackoverflow.com/questions/15440154
复制相似问题