gpt4 book ai didi

debugging - 如何在GDB中更改eflags寄存器值?

转载 作者:行者123 更新时间:2023-12-04 02:56:11 25 4
gpt4 key购买 nike

set $eflags不会更改eflags值。

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

另外,是否可以设置eflags的各个标志?

我正在寻找类似的东西:set ZF[zero flag]。有gdb命令可以执行此操作吗?

最佳答案

没有括号的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.


所有其他按位操作也是如此: 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


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,第3、5、15和22-31位为0

关于debugging - 如何在GDB中更改eflags寄存器值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15440154/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com