2013-03-15 17 views
6

Nie można zmienić wartości eflags.Jak zmienić wartość rejestru eflags w GDB?

Stara wartość eflags pozostaje po np. =>$set $eflag=0x243 [to tylko przykładowy wpis].

Czy istnieje sposób na ustawienie poszczególnych flag: eflags?

Szukam czegoś takiego: set ZF[zero flag]. Czy jest to polecenie gdb?

+1

eflags [ZF] powinien zrobić .. –

+2

Mam "Niezdefiniowane polecenie:" eflags. "Spróbuj" pomóż "." z "eflags [ZF]". Czy możesz podać przykład tego polecenia? – snakeninny

Odpowiedz

6
set ($eflags)=0x243 

pracowali w moich testów dla każdej wartości hex.

+0

W GDB 7.7.1 nawiasy nie wydają się być wymagane: http://stackoverflow.com/a/31339372/895245 –

0
eflags [ ZF ] 

A jeśli chcesz ustawić wartość użytkową arbitralne to

EFLAGS 0x42

+4

Otrzymuję 'Niezdefiniowane polecenie:" eflags ". Spróbuj "pomóc". ' – Saphrosit

+3

Użyj' set ($ eflags) | = 0x42', aby ustawić [ZF] (http://en.wikipedia.org/wiki/Zero_flag). Przetestowany. –

9

set $eflags bez nawiasu działa w GDB 7.7.1

Aby ustawić indywidualny flagę, użyj swojego indeksu. Np ZF jest 6 bitów, dzięki czemu możemy ustawić go z:

set $ZF = 6 
set $eflags |= (1 << $ZF) 

To samo dotyczy wszystkich innych operacji bitowe: How do you set, clear, and toggle a single bit?

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

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

Co powoduje zamieszanie jest, że wiele bitów albo są zastrzeżone, nie może być modyfikowany bezpośrednio przez żadną instrukcję lub nie może być modyfikowany z trybu użytkownika, zobacz także: Flags registers - Can we read or write them directly?, a więc GDB ich nie dotyka.

Na przykład:

(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 binarnie jest:

0010 0000 0010 

0x54fd7 binarnie jest:

0101 0100 1111 1101 0111 

TODO zrozumieć, dlaczego każdy z tych bitów były ustawione czy nie, patrząc na instrukcję http://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-software-developer-vol-1-manual.pdf i GDB s kod źródłowy.

Te, że rozumie:

  • wszystkie zastrzeżone rejestry pozostawiono na wartości stałej: 1 dla bitu 1, i od 0 do 3 bitów, 5, 15 i 22-31
+0

Co robi komenda set $ eflags | = (1 << $ ZF)? Dlaczego wartość $ ZF = 6 jest niewystarczająca? – user3364161

+0

@ user3364161 tylko po to, aby uniknąć magicznych stałych w kodzie i automatycznie dokumentować, co mają na myśli. ZF = 6 również by działało. –

0

To źle, aby ustawić wszystkie flagi w rejestrze eflags. Tak więc niektóre bity zarezerwowane i muszą mieć wartość 0. (3, 15, 25, 22 i więcej) bit 1 musi wynosić 1. Są też rflagi. Ale wszystkie hi dword jest zerro. Nie ma więc potrzeby używania rflagów zamiast eflagów dla wszystkich zmienionych operacji flag. Ale znam ludzi, którzy używają darmowych bitów do własnego użytku. Bardziej odpowiednie rflags hi dword. Tak więc w architekturze 64-bitowej wystarczy wolnych rejestrów do użycia. Ale w 32-bitowym łuku nie. Zdecydowanie zalecane, aby to zrobić. Ponieważ w przyszłych łukach niektóre z tych bitów mogą być używane. Ale te flagi nie dotykają formy zmiany 32-bitowego łuku na 64. To jedyny rejestr, który nie może być w ogóle zmieniony. Więc wszystkie możliwe powody dla każdego przypadku już wykorzystane.Nie wyobrażam sobie żadnej sytuacji, w której można by użyć jakiejś dodatkowej flagi do chwili obecnej. Może to być jakaś kardynalna zmiana architektury procesora. Nie sądzę, że niektórzy decydują się na to z oczywistego powodu, wszystkie miękkie muszą być wyrzucone i przepisane od samego początku. To bardzo ciężka i ogromna praca ...

+1

Ta odpowiedź mogłaby używać niektórych akapitów i "tyknięć". – GiantsLoveDeathMetal

+0

Oryginalny plakat nie powiedział, że chciał ustawić wszystkie bity, ale konkretne lub grupę (podali 0x243 jako przykład). Chcieli czysty sposób ustawiania poszczególnych flag. –

Powiązane problemy