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

Yog*_*han 10 debugging assembly flags gdb

set $eflags没有改变eflags价值.

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

或者,有没有办法设置个别标志eflags

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

Cir*_*四事件 16

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.
Run Code Online (Sandbox Code Playgroud)

所有其他按位操作也是如此:如何设置,清除和切换单个位?

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

# Toggle
set $eflags ^= (1 << $ZF)
Run Code Online (Sandbox Code Playgroud)

造成混淆的原因是许多位要么被保留,要么不能被任何指令直接修改,要么无法从用户模式修改,另请参见:如何直接读写x86标志寄存器?因此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 ]
Run Code Online (Sandbox Code Playgroud)

0x202 二进制是:

0010 0000 0010
Run Code Online (Sandbox Code Playgroud)

0x54fd7 二进制是:

0101  0100 1111 1101 0111
Run Code Online (Sandbox Code Playgroud)

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,1表,15表和22-31表


Yog*_*han 6

set ($eflags)=0x243
Run Code Online (Sandbox Code Playgroud)

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