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
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
バイト数は、隣接する命令間のアドレスの差です。
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にアクセスして、各命令、プレフィックス、およびオペランドを計算してください。
ニーモニックから命令サイズを判断できるとは限りません。以下にいくつかの特殊なケースを示します。
16 ビット セグメントのmov eax, 0
場合はプレフィックスが必要です0x66
が、32 ビット セグメントの場合は必要ありません。セグメントのサイズを知る必要があります。
32 ビットまたは 16 ビット モードでは、 ( ) または( )add eax, 1
としてエンコードできます。つまり、複数の方法でエンコードできるニーモニックがいくつかあります。0x40
inc eax
0x83 0xc0 0x01
add eax, 1
メモリ オペランドは、ベースまたはインデックスのいずれかとして[eax]
エンコードできます。eax
インデックスの場合、MOD/RM の後に追加の SIB バイトがあります。
64 ビット モードでは、REX プレフィックスを使用して0x4x
レジスタをエンコードできます。ただし、命令に別のバイトを追加する、ある種のヌル REX バイトとして使用できます。r8
r15
0x40
明示的なセグメントが暗黙的なセグメントと同じであっても、セグメントのオーバーライドを使用できます。
多かれ少なかれバイトを使用して命令をエンコードするには、他にも多くの方法があります。優れたアセンブラは、おそらく常に最短のものを使用する必要がありますが、アーキテクチャによっては必須ではありません。良いことに、Intel IA-32 Software Developer's Manual の Volume 2 を学習すれば、自分で解決できるはずです。
最初の命令は[main+0]にあり、2番目の命令は[main + 1]にあるため、最初の命令は1バイトです。3番目の命令は[main+3]にあるため、2番目の命令は2バイトです。4.命令のアドレスが表示されていないため、リストから3番目の命令の長さを知ることはできません。
テキストでアセンブリコードを使用している場合は、アセンブラルーチンを使用して、
バイナリ表現、つまり命令のサイズを取得する必要があります。もちろん、それはハードウェアに依存します。
たとえば、これは80x86 32ビットアセンブラオープンソースコード(OllyDbg v1.10)です。