7
0x004012d0 <main+0>:    push   %ebp
0x004012d1 <main+1>:    mov    %esp,%ebp
0x004012d3 <main+3>:    sub    $0x28,%esp

住所が不明な場合、自分で計算できますか?

つまり、これしかありません:

push   %ebp
mov    %esp,%ebp
sub    $0x28,%esp
4

5 に答える 5

6

バイト数は、隣接する命令間のアドレスの差です。

0x004012d0 <main+0>:    push   %ebp ;1 byte
0x004012d1 <main+1>:    mov    %esp,%ebp ;2 bytes
0x004012d3 <main+3>:    sub    $0x28,%esp

テキストしかない場合は、 http: //www.swansontec.com/sintel.htmlおよびここ:http ://faydoc.tripod.com/cpu/conventions.htmにアクセスして、各命令、プレフィックス、およびオペランドを計算してください。

于 2010-03-30T16:10:35.823 に答える
3

ニーモニックから命令サイズを判断できるとは限りません。以下にいくつかの特殊なケースを示します。

  • 16 ビット セグメントのmov eax, 0場合はプレフィックスが必要です0x66が、32 ビット セグメントの場合は必要ありません。セグメントのサイズを知る必要があります。

  • 32 ビットまたは 16 ビット モードでは、 ( ) または( )add eax, 1としてエンコードできます。つまり、複数の方法でエンコードできるニーモニックがいくつかあります。0x40inc eax0x83 0xc0 0x01add eax, 1

  • メモリ オペランドは、ベースまたはインデックスのいずれかとして[eax]エンコードできます。eaxインデックスの場合、MOD/RM の後に追加の SIB バイトがあります。

  • 64 ビット モードでは、REX プレフィックスを使用して0x4xレジスタをエンコードできます。ただし、命令に別のバイトを追加する、ある種のヌル REX バイトとして使用できます。r8r150x40

  • 明示的なセグメントが暗黙的なセグメントと同じであっても、セグメントのオーバーライドを使用できます。

多かれ少なかれバイトを使用して命令をエンコードするには、他にも多くの方法があります。優れたアセンブラは、おそらく常に最短のものを使用する必要がありますが、アーキテクチャによっては必須ではありません。良いことに、Intel IA-32 Software Developer's Manual の Volume 2 を学習すれば、自分で解決できるはずです。

于 2010-05-03T21:12:10.633 に答える
1

最初の命令は[main+0]にあり、2番目の命令は[main + 1]にあるため、最初の命令は1バイトです。3番目の命令は[main+3]にあるため、2番目の命令は2バイトです。4.命令のアドレスが表示されていないため、リストから3番目の命令の長さを知ることはできません。

于 2010-03-30T16:40:39.143 に答える
0

テキストでアセンブリコードを使用している場合は、アセンブラルーチンを使用して、
バイナリ表現、つまり命令のサイズを取得する必要があります。もちろん、それはハードウェアに依存します。

たとえば、これは80x86 32ビットアセンブラオープンソースコードOllyDbg v1.10)です。

于 2010-03-30T16:37:19.567 に答える