2013-03-15 20 views
6

set $eflags non cambia il valore eflags.Come modificare il valore del registro eflags in GDB?

Il vecchio valore eflags rimane dopo es. =>$set $eflag=0x243 [questo è solo un esempio di input].

In alternativa, esiste un modo per impostare singole bandiere di eflags?

Sto cercando qualcosa come: set ZF[zero flag]. C'è un comando gdb per farlo?

+1

eflags [ZF] dovrebbe fare .. –

+2

Ho ottenuto "Comando non definito:" eflags ". Prova" help "." con "eflags [ZF]". Puoi dare un esempio di questo comando? – snakeninny

risposta

6
set ($eflags)=0x243 

lavorato nel mio test per qualsiasi valore esadecimale.

+0

In GDB 7.7.1, la parentesi non sembra essere richiesta: http://stackoverflow.com/a/31339372/895245 –

0
eflags [ ZF ] 

E se si desidera impostare l'uso valore arbitrario questo

EFlag 0x42

+4

Ricevo il comando 'indefinito:" eflags ". Prova "help" .' – Saphrosit

+3

Usa 'set ($ eflags) | = 0x42' per impostare [ZF] (http://en.wikipedia.org/wiki/Zero_flag). Provato. –

9

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
+0

Che cosa fa il comando $ eflags | = (1 << $ ZF)? Perché il set $ ZF = 6 non è sufficiente? – user3364161

+0

@ user3364161 solo per evitare le costanti magiche nel codice e documentare automaticamente cosa significano. ZF = 6 funzionerebbe altrettanto bene, naturalmente. –

0

È sbagliato impostare tutti i flag nel registro eflags. Quindi alcuni bit riservati e devono essere 0. (3,5,15,22 e maggiore) il bit 1 deve essere 1. C'è anche rflags. Ma tutto hiword è zerro. Quindi non c'è bisogno di usare rflags invece di eflags per tutte le operazioni cambiate flag. Ma conosco gente che usa bit gratuiti per il proprio uso. Più adatto rflags hi dword. Quindi in architettura a 64 bit abbastanza registri liberi da usare. Ma in 32-bit arch no. Così fortemente consigliato di farlo. Perché in archi futuri è possibile utilizzare alcuni di questi bit. Ma questi flag non toccano il cambiamento di form 32 bit arch a 64. È l'unico registro che non può essere cambiato affatto. Quindi tutte le possibili ragioni per ogni caso già utilizzate.Non immagino che nessuna situazione possa essere utilizzata qualche bandiera aggiuntiva non venga utilizzata fino ad ora. Potrebbe essere un cambiamento dell'architettura del processore cardinale. Non credo che alcuni decidano di farlo per ovvi motivi tutti i soft devono essere buttati fuori e riscritti sin dall'inizio. È estremamente difficile ed enorme lavoro ...

+1

Questa risposta potrebbe utilizzare alcuni paragrafi e 'back-ticks' – GiantsLoveDeathMetal

+0

Il poster originale non ha detto che volevano impostare tutti i bit, ma specifici o un gruppo (hanno dato 0x243 come esempio). Volevano un modo pulito per impostare singole bandiere. –

Problemi correlati