Как изменить значение регистра eflags в GDB?

set $eflags не меняет eflags значение.

старый eflags значение остается после ЭГ. =>$set $eflag=0x243 [это только пример ввода].

кроме того, есть ли способ установить отдельные флаги eflags?

Я ищу что-то вроде: set ZF[zero flag]. Есть ли команда gdb для этого?

4 ответов


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.

то же самое относится ко всем другим побитовым операциям: как вы устанавливаете, очищаете и переключаете один бит?

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

# Toggle
set $eflags ^= (1 << $ZF)

что вызывает путаницу, так это то, что многие биты либо зарезервированы, не могут быть изменены непосредственно какой-либо инструкцией, либо не могут быть изменены из пользовательского режима, см. Также: как читать и писать 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 ]

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 и 0 для битов 3, 5, 15 и 22-31

set ($eflags)=0x243

работали в моих тестах для любого шестнадцатеричного значения.


eflags [ ZF ]

и если вы хотите установить произвольное значение использовать этот

регистра флагов 0x42


неправильно устанавливать все флаги в eflags зарегистрироваться. Так некоторые биты зарезервированы и должны быть равны 0.(3,5,15,22 и выше) бит 1 должен быть 1. Есть rflags тоже. Но все!--2--> равна нулю. Так что нет необходимости использовать rflags вместо eflags для всех операций, сменили флаги. Но я знаю людей, которые используют бесплатные биты для собственного использования.

больше подходит rflags hi dword. Поэтому в 64-битной архитектуре достаточно свободных регистров для использования. Но в 32-битной архитектуре-нет. Поэтому настоятельно рекомендую делать так.

потому что в будущих архитектурах некоторые из этих битов могут быть использованы. Но эти флаги не коснулись изменения 32-битного на 64-битный. Если единственный регистр, который может быть не изменилась. Так что все возможные причины для любого случая уже использованы. Я не думаю, что какая-либо ситуация, которая может быть использована, какой-то дополнительный флаг не используется до сих пор. Это может быть какое-то кардинальное изменение архитектуры процессора. Я не думаю, что некоторые решают сделать это по очевидной причине, все мягкое должно быть выброшено и переписать с самого начала. Это очень тяжелая и огромная работа.