set $eflags
はeflags
値を変更しません。
古いeflags
値は、たとえばの後に残ります。 =>$set $eflag=0x243
[これは単なる入力例です]。
あるいは、eflags
の個々のフラグを設定する方法はありますか?
私は次のようなものを探しています:set ZF[zero flag]
。それを行うためのgdbコマンドはありますか?
set ($eflags)=0x243
私のテストでは、任意の16進値で動作しました。
set $eflags
括弧なしはGDB7.7.1で機能します
個別のフラグを設定するには、そのインデックスを使用します。たとえば、ZFは6番目のビットなので、次のように設定できます。
set $ZF = 6 # define a GDB variable: no effect on registers
set $eflags |= (1 << $ZF) # set bit 6 in EFLAGS, the ZF bit.
同じことが他のすべてのビット演算にも当てはまります: どのように単一ビットを設定、クリア、および切り替えますか?
# Clear
set $eflags &= ~(1 << $ZF)
# Toggle
set $eflags ^= (1 << $ZF)
混乱の原因は、多くのビットが予約されているか、命令によって直接変更できないか、ユーザーモードから変更できないことです。以下も参照してください。 x86フラグレジスタを直接読み書きする方法 などGDBそれらに触れません。
例えば:
(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
バイナリで:
0010 0000 0010
0x54fd7
バイナリで:
0101 0100 1111 1101 0111
TODOは、マニュアルを見ると、これらの各ビットが設定されているかどうかを理解しています http://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia -32-architectures-software-developer-vol-1-manual.pdf およびGDBソースコード。
私が理解しているもの:
eflags [ ZF ]
そして、任意の値を設定したい場合は、これを使用してください
eflags 0x42
eflags
レジスタにすべてのフラグを設定するのは誤りです。したがって、一部のビットは予約されており、0でなければなりません。(3,5,15,22以上)ビット1は1でなければなりません。rflags
もあります。しかし、すべてhi dword
はゼロです。したがって、変更されたすべての操作フラグに対して、rflags
の代わりにeflags
を使用する必要はありません。しかし、私は自分の使用のために無料のビットを使用する人々を知っています。
より適切な rflags hi dword
。したがって、64ビットアーキテクチャでは、使用するのに十分な空きレジスタがあります。しかし、32ビットアーキテクチャでは違います。そうすることを強くお勧めします。
将来のアーキテクチャでは、これらのビットの一部が使用される可能性があるためです。ただし、これらのフラグは、32ビットから64ビットへの変更から変更されません。まったく変更されない可能性がある唯一のレジスタの場合。したがって、すでに使用されているすべてのケースの考えられる理由。使用される可能性のある状況は、今まで使用されていない追加のフラグがあるとは思いません。それは、いくつかの基本的なプロセッサアーキテクチャの変更によるものかもしれません。明らかな理由でそうすることを決心する人はいないと思います。すべてのソフトを最初から捨てて書き直さなければなりません。非常に大変で大変な作業です。