set $eflags
senza parentesi lavora in GDB 7.7.1
Per impostare una bandiera individuale, utilizzare il suo indice. Ad esempio, ZF è il 6 ° bit, per cui possiamo impostare con:
set $ZF = 6
set $eflags |= (1 << $ZF)
Lo stesso vale per tutte le altre operazioni bit per bit: How do you set, clear, and toggle a single bit?
# Clear
set $eflags &= ~(1 << $ZF)
# Toggle
set $eflags ^= (1 << $ZF)
cosa provoca confusione è che molti bit sono o riservati, non può essere modificato direttamente da alcuna istruzione, o non può essere modificato dalla modalità utente, vedi anche: Flags registers - Can we read or write them directly? e quindi GDB non li tocca.
Ad esempio:
(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
in binario è:
0010 0000 0010
0x54fd7
in binario è:
0101 0100 1111 1101 0111
TODO capire perché ciascuno di tali bit sono stati fissati o no, guardando il manuale http://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-software-developer-vol-1-manual.pdf e GDB s codice nostro.
Quelli che comprendo:
- tutti registri riservati sono stati lasciati al loro valore fisso: 1 per bit 1 e 0 per i bit 3, 5, 15 e 22-31
fonte
2015-07-10 11:15:23
eflags [ZF] dovrebbe fare .. –
Ho ottenuto "Comando non definito:" eflags ". Prova" help "." con "eflags [ZF]". Puoi dare un esempio di questo comando? – snakeninny