2012-04-22 16 views
4

私は%eaxにアドレスを持っていますが、私はjmpにしたいと思いますが、コードはコンパイルされません。x86 jmpを登録する

movl 0xdeadbeef, %eax 

jmp %eax ; <--- compile error: type mismatch for 'jmp' 
+0

あなたはどのアセンブラを使用していますか? – Crashworks

+4

'jmp *%eax'を試してください – ughoavgfhw

+2

@Crashworks、GAS(主流のアセンブラだけを数える)だけが、この奇妙で読めない構文を使用しています。 – Griwes

答えて

16

誰もを提供することができませんでしたので、正解、ここにあります:

jmp *%eax 
+0

当時の唯一の正解はなぜ投票されたのだろうと思っています^^気をつけてください、愛されたdownvoter? – hirschhornsalz

4

何もないが動作する場合、あなたは常に次のトリックを使用することができます:x86_64のために

push eax 
ret 
+0

AT&Tの構文では 'pushl%eax#ret'のようになります:) –

+0

ありがとう@NiklasB!私はちょうどそのアイデアを伝えていました...私はAT&Tの構文に慣れていませんが、私はそのアイデアを渡すことを望んでいませんでした... – guga

+5

最新の80x86 CPUはバッファ/ RETが実際に何を返すかを知る前に、RETがどのアドレスに戻るか予測することができます(そして推測的な実行を続けます)。偽装されたリターンは、リターンバッファの深さのための "return mispredictions"を続行する可能性があり、即座の "return mispredicted"から開始し、パフォーマンスを傷つけます。基本的に、あなたがしなければならない限り(そして、この場合はあなたがする必要はありません)、それをしないでください。 – Brendan

5
// target address in eax 
jmp *%eax 

// target pointer address in eax 
jmp *(%eax) 

を、レジスタは次のとおりです。%rax

関連する問題