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
eflags [ZF] sollte tun .. –
Ich habe "Undefined Befehl:" Eflags ". Versuchen Sie" Hilfe "." mit "eflags [ZF]". Können Sie ein Beispiel für diesen Befehl geben? – snakeninny