2013-03-15 7 views
6

set $eflags ändert sich nicht eflags Wert.Wie ändere ich den eflags Registerwert in GDB?

Der alte eflags Wert bleibt nach z. =>$set $eflag=0x243 [Dies ist nur eine Beispieleingabe].

Oder gibt es eine Möglichkeit, individuelle Flags von eflags zu setzen?

Ich suche nach etwas wie: set ZF[zero flag]. Gibt es einen gdb-Befehl, um das zu tun?

+1

eflags [ZF] sollte tun .. –

+2

Ich habe "Undefined Befehl:" Eflags ". Versuchen Sie" Hilfe "." mit "eflags [ZF]". Können Sie ein Beispiel für diesen Befehl geben? – snakeninny

Antwort

6
set ($eflags)=0x243 

in meinen Tests für alle Hex-Wert gearbeitet.

+0

In GDB 7.7.1 scheint die Klammer nicht erforderlich zu sein: http://stackoverflow.com/a/31339372/895245 –

0
eflags [ ZF ] 

Und wenn Sie wollen beliebigen Wert verwenden setzen dieses

EFLAGS 0x42

+4

Ich bekomme 'Undefinierter Befehl:" eflags ". Probiere "Hilfe". " – Saphrosit

+3

Verwende' set ($ eflags) | = 0x42', um [ZF] (http://en.wikipedia.org/wiki/Zero_flag) zu setzen. Geprüft. –

9

set $eflags ohne Klammer arbeitet in GDB 7.7.1

eine individuelle Flagge zu setzen, seinen Index zu verwenden. ZB ZF das sechste Bit ist, so dass wir es mit einstellen:

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

Das gleiche gilt für alle anderen bitweise Operationen: How do you set, clear, and toggle a single bit?

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

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

Was Verwirrung verursacht, ist, dass viele Bits entweder reserviert sind, kann nicht direkt durch irgendeine Anweisung geändert werden, oder kann nicht vom Benutzermodus geändert werden, siehe auch: Flags registers - Can we read or write them directly? und so berührt GDB sie nicht.

Zum Beispiel:

(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 binär ist:

0010 0000 0010 

0x54fd7 binär ist:

0101 0100 1111 1101 0111 

TODO verstehen, warum jedes dieser Bits gesetzt wurden oder nicht, durch Blick auf das Handbuch http://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-software-developer-vol-1-manual.pdf und GDB s unser Code.

, die ich verstehen:

  • alle reservierten Register an ihrem festen Wert gelassen wurden: 1 für das Bit 1 und 0 für die Bits 3, 5, 15 und 22-31
+0

Was bewirkt der Befehl $ eflags | = (1 << $ ZF)? Warum ist $ ZF = 6 nicht genug? – user3364161

+0

@ user3364161 nur um magische Konstanten im Code zu vermeiden, und automatisch dokumentieren, was sie bedeuten. ZF = 6 würde natürlich auch funktionieren. –

0

Es ist falsch, alle Flags im Eflags-Register zu setzen. Also einige Bits reserviert und müssen 0. (3,5,15,22 und größer) Bit 1 muss 1 sein. Es gibt auch rflags. Aber alles Halloword ist zerro. Es ist also nicht notwendig, rflags statt eflags für alle Operationen zu verwenden, die Flags geändert haben. Aber ich kenne Leute, die freie Bits für den eigenen Gebrauch benutzen. Mehr geeignete rflags hallo dword. Also in 64-Bit-Architektur genug freie Register zu verwenden. Aber in 32-Bit-Arch-Nr. So dringend empfohlen. Da in Zukunft Archs einige dieser Bits verwendet werden können. Aber diese Flags berühren nicht den 32-Bit-Änderungsbogen auf 64. Es ist das einzige Register, das überhaupt nicht geändert werden kann. Also alle möglichen Gründe für jeden Fall bereits genutzt.Ich kann mir keine Situation vorstellen, die benutzt werden könnte. Es kann zu einigen grundlegenden Prozessorarchitekturänderungen kommen. Ich denke nicht, dass einige aus offensichtlichen Gründen entscheiden, dass alles Weiche von Anfang an rausgeschmissen und neu geschrieben werden muss. Es ist extrem hart und große Arbeit ...

+1

Diese Antwort könnte einige Absätze und "Back-Ticks" verwenden – GiantsLoveDeathMetal

+0

Das ursprüngliche Plakat sagte nicht, dass sie alle Bits setzen wollten, aber bestimmte oder eine Gruppe (sie gaben 0x243 als Beispiel). Sie wollten eine saubere Möglichkeit, einzelne Flaggen zu setzen. –

Verwandte Themen