Как изменить значение регистра 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
eflags [ ZF ]
и если вы хотите установить произвольное значение использовать этот
регистра флагов 0x42
неправильно устанавливать все флаги в eflags
зарегистрироваться. Так некоторые биты зарезервированы и должны быть равны 0.(3,5,15,22 и выше) бит 1 должен быть 1. Есть rflags
тоже. Но все!--2--> равна нулю. Так что нет необходимости использовать rflags
вместо eflags
для всех операций, сменили флаги. Но я знаю людей, которые используют бесплатные биты для собственного использования.
больше подходит rflags hi dword
. Поэтому в 64-битной архитектуре достаточно свободных регистров для использования. Но в 32-битной архитектуре-нет. Поэтому настоятельно рекомендую делать так.
потому что в будущих архитектурах некоторые из этих битов могут быть использованы. Но эти флаги не коснулись изменения 32-битного на 64-битный. Если единственный регистр, который может быть не изменилась. Так что все возможные причины для любого случая уже использованы. Я не думаю, что какая-либо ситуация, которая может быть использована, какой-то дополнительный флаг не используется до сих пор. Это может быть какое-то кардинальное изменение архитектуры процессора. Я не думаю, что некоторые решают сделать это по очевидной причине, все мягкое должно быть выброшено и переписать с самого начала. Это очень тяжелая и огромная работа.