web-dev-qa-db-ja.com

GDBのeflagsレジスタ値を変更するにはどうすればよいですか?

set $eflagseflags値を変更しません。

古いeflags値は、たとえばの後に残ります。 =>$set $eflag=0x243 [これは単なる入力例です]。

あるいは、eflagsの個々のフラグを設定する方法はありますか?

私は次のようなものを探しています:set ZF[zero flag]。それを行うためのgdbコマンドはありますか?

10
set ($eflags)=0x243

私のテストでは、任意の16進値で動作しました。

6

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ソースコード。

私が理解しているもの:

  • すべての予約済みレジスタは固定値のままでした。ビット1の場合は1、ビット3、5、15、および22〜31の場合は0です。
eflags [ ZF ]

そして、任意の値を設定したい場合は、これを使用してください

eflags 0x42

0
Shmil The Cat

eflagsレジスタにすべてのフラグを設定するのは誤りです。したがって、一部のビットは予約されており、0でなければなりません。(3,5,15,22以上)ビット1は1でなければなりません。rflagsもあります。しかし、すべてhi dwordはゼロです。したがって、変更されたすべての操作フラグに対して、rflagsの代わりにeflagsを使用する必要はありません。しかし、私は自分の使用のために無料のビットを使用する人々を知っています。

より適切な rflags hi dword。したがって、64ビットアーキテクチャでは、使用するのに十分な空きレジスタがあります。しかし、32ビットアーキテクチャでは違います。そうすることを強くお勧めします。

将来のアーキテクチャでは、これらのビットの一部が使用される可能性があるためです。ただし、これらのフラグは、32ビットから64ビットへの変更から変更されません。まったく変更されない可能性がある唯一のレジスタの場合。したがって、すでに使用されているすべてのケースの考えられる理由。使用される可能性のある状況は、今まで使用されていない追加のフラグがあるとは思いません。それは、いくつかの基本的なプロセッサアーキテクチャの変更によるものかもしれません。明らかな理由でそうすることを決心する人はいないと思います。すべてのソフトを最初から捨てて書き直さなければなりません。非常に大変で大変な作業です。

0
Anatoliy