私は%eax
にアドレスを持っていますが、私はjmpにしたいと思いますが、コードはコンパイルされません。x86 jmpを登録する
movl 0xdeadbeef, %eax
jmp %eax ; <--- compile error: type mismatch for 'jmp'
私は%eax
にアドレスを持っていますが、私はjmpにしたいと思いますが、コードはコンパイルされません。x86 jmpを登録する
movl 0xdeadbeef, %eax
jmp %eax ; <--- compile error: type mismatch for 'jmp'
誰もを提供することができませんでしたので、正解、ここにあります:
jmp *%eax
当時の唯一の正解はなぜ投票されたのだろうと思っています^^気をつけてください、愛されたdownvoter? – hirschhornsalz
何もないが動作する場合、あなたは常に次のトリックを使用することができます:x86_64のために
push eax
ret
AT&Tの構文では 'pushl%eax#ret'のようになります:) –
ありがとう@NiklasB!私はちょうどそのアイデアを伝えていました...私はAT&Tの構文に慣れていませんが、私はそのアイデアを渡すことを望んでいませんでした... – guga
最新の80x86 CPUはバッファ/ RETが実際に何を返すかを知る前に、RETがどのアドレスに戻るか予測することができます(そして推測的な実行を続けます)。偽装されたリターンは、リターンバッファの深さのための "return mispredictions"を続行する可能性があり、即座の "return mispredicted"から開始し、パフォーマンスを傷つけます。基本的に、あなたがしなければならない限り(そして、この場合はあなたがする必要はありません)、それをしないでください。 – Brendan
// target address in eax
jmp *%eax
// target pointer address in eax
jmp *(%eax)
を、レジスタは次のとおりです。%rax
あなたはどのアセンブラを使用していますか? – Crashworks
'jmp *%eax'を試してください – ughoavgfhw
@Crashworks、GAS(主流のアセンブラだけを数える)だけが、この奇妙で読めない構文を使用しています。 – Griwes