コンパイルしてから抽出したテキストコードを使用する単純な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つの例では、今後のみジャンプしますが、前の位置にジャンプすることもできます。