分岐opcodeとはどういう意味ですか(X86アーキテクチャ)?

分岐opcodeとはどういう意味ですか(X86アーキテクチャ)?

コンパイルしてから抽出したテキストコードを使用する単純なCコードがあります。オブジェクトダンプ便利です。以下はダンプファイルです(ダンプファイルの一部)。

0804841b <main>:
 804841b:   8d 4c 24 04             lea    0x4(%esp),%ecx
 804841f:   83 e4 f0                and    $0xfffffff0,%esp
 8048422:   ff 71 fc                pushl  -0x4(%ecx)
 8048425:   55                      push   %ebp
 8048426:   89 e5                   mov    %esp,%ebp
 8048428:   51                      push   %ecx
 8048429:   83 ec 14                sub    $0x14,%esp
 804842c:   c7 45 f0 00 00 00 00    movl   $0x0,-0x10(%ebp)
 8048433:   c7 45 f4 0a 00 00 00    movl   $0xa,-0xc(%ebp)
 804843a:   8b 45 f4                mov    -0xc(%ebp),%eax
 804843d:   01 45 f0                add    %eax,-0x10(%ebp)
 8048440:   8b 45 f0                mov    -0x10(%ebp),%eax
 8048443:   3b 45 f4                cmp    -0xc(%ebp),%eax

 8048446:   7e 0f                   jle    8048457 <main+0x3c>

 8048448:   83 ec 0c                sub    $0xc,%esp
 804844b:   6a 78                   push   $0x78
 804844d:   e8 be fe ff ff          call   8048310 <putchar@plt>
 8048452:   83 c4 10                add    $0x10,%esp
 8048455:   eb 15                   jmp    804846c <main+0x51>
 8048457:   8b 45 f4                mov    -0xc(%ebp),%eax
 804845a:   3b 45 f0                cmp    -0x10(%ebp),%eax
 804845d:   7e 0d                   jle    804846c <main+0x51>

アドレスの命令は機械語を含む命令8048446です。jle 8048457 <main+0x3c>7e 0f

この<main+0x3c>ステートメントは、ベースアドレスから移動したターゲット命令の位置を示します。つまり、3cは60に等しい。これは、ベースアドレスの60バイト後に命令が

8048457:   8b 45 f4                mov    -0xc(%ebp),%eax

横になる。アドレス7e8048446の命令の機械語コード7e 0f
はjleの機械語コードです。0fとは何ですか?

次のような他の分岐命令では:

 8048455:   eb 15                   jmp    804846c <main+0x51>

15 とはどういう意味ですか?

答え1

Intel CPUアーキテクチャには、絶対ジャンプ/コード分岐と相対ジャンプがあります。

私たちに示しているのは相対オペランドオペコードジャンプです。歴史的にコードサイズを節約するために使用されました。

0fが何であるかを尋ねると、現在PCにジャンプすることを意味します現在のコマンドの終わりに+0fを実行しています。したがって、8048448+0f = 8048457 なので、アセンブリのリストに表示されますjle 8048457(jle は小さいか等しい場合はジャンプを意味します)。

同様に8048457+15=804846cなのでjmp 804846c

すべての値と数学は16進数です。

また、追加の注意事項として、相対ジャンプ演算コードのオペランドは通常署名されます。これら2つの例では、今後のみジャンプしますが、前の位置にジャンプすることもできます。

関連情報