2012-01-23 1 views
2

値:x86の登録が& T組立ラインで次のx86-64考える

cmpl $0x7,0xc(%rsp)

これは、メモリ内の$ RSPからのオフセット12日にアクセスしています。したがって、メモリにrspの後に48バイト、またはrspの後に12*8 = 96の96番目のバイトにアクセスすると、12*4 = 48にアクセスしていますか?これは64ビットアーキテクチャなので、レジスタの長さは8バイトなので、96ビットですか?

いずれにしても、gdbのその位置にアクセスするには、x/96s $rspを実行しますか?オフセットの全リストなしでそれを簡単に印刷する方法はありますか?

x/12s $rspと書くと、メモリアドレスは0x7FFFFFFFE1F0から0x7FFFFFFFE20Dになります。したがって、開始点と終了点のオフセットの差は29バイトです。私は12を指定したとき、それはどのように論理的ですか?

は、その命令が rsp上記のデータ12のバイトを見ているので、

答えて

4

は、アセンブリ内のオフセットは、バイトがオフセットされて、ありがとうございます。これは、x86ではSSE命令の場合を除き、任意のアドレスへのアクセスが許可されているため、その一部は16バイト境界整列を必要とするためです。 GDBで

/後の数字は、あなたがオフセットではなく、見たいと思ってどのように多くのデータの断片を示しています。レジスタをオフセットしたい場合は、レジスタをその場所に追加する必要があります。また、s型指定子を使用しているため、30バイトが表示されています。つまり、gdbはnullで終了する文字列を表示しています。データを表示するには、別の形式を使用する必要があります。いくつかのオプションは次のとおりo(8進数)、x(16進数)、d(10進数)、t(バイナリ)、およびi(命令)。 (リスト全体を見るにはhelp xを使用してください)。また、数値タイプのいずれかに表示するデータのサイズも指定する必要があります。 b(バイト)、h(2バイト)、w(4バイト)、またはg(8バイト)を使用します。あなたはrsp後に12のバイトを始める2 4バイトワードを見て、彼らは16進数で表示したい場合は、あなたが使用する例えば

x/2wx $rsp + 12 
+0

IIRC、 'cmpl'命令は32ビットのためであります(cmpbは1バイトで、cmpwは16ビットの値になります)、オフセットとして+ 3 * 4を使って見ても驚くことはありません。64ビットの値に対して 'cmpq'を使います。ビット値、それはありませんか? – PypeBros