2012-04-22 45 views
4

所以我在%eax我有一個地址我想jmp但代碼不會編譯,有沒有辦法解決這個問題?x86 jmp註冊

movl 0xdeadbeef, %eax 

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

您正在使用哪種彙編程序? – Crashworks 2012-04-22 20:58:36

+4

試試'jmp *%eax' – ughoavgfhw 2012-04-22 20:59:27

+2

@Crashworks,只有GAS(只計算主流彙編程序)使用這種奇怪而且無法讀取的語法... – Griwes 2012-04-22 20:59:53

回答

16

既然沒有人能爲你提供正確的答案,這裏是:

jmp *%eax 
+0

我不知道爲什麼當時唯一正確的答案被拒絕^^關心解釋,心愛的downvoter? – hirschhornsalz 2012-04-23 10:10:51

4

,如果沒有別的工作,你總是可以使用下面的技巧:

push eax 
ret 
+0

在AT&T語法的情況下更像'pushl%eax#ret' :) – 2012-04-22 21:03:34

+0

感謝@NiklasB。!我只是給出了這個想法......我不熟悉AT&T的語法,但我不想讓這個想法通過... – guga 2012-04-22 21:07:26

+5

請注意,大多數現代80x86 CPU會跟蹤緩衝區中的調用/返回,以便它們可以預測RET將返回到什麼地址(並繼續進行推測性執行),然後才能知道RET將實際返回到什麼地方。假立即返回將會導致性能下降並損害性能,從立即「返回錯誤預測」(而不是可能的「jmp /分支預測」)開始,並可能繼續返回緩衝區深度的「返回錯誤預測」。基本上,不要這樣做,除非你必須(而且你不必在這種情況下)。 – Brendan 2012-04-22 22:59:44

5
// target address in eax 
jmp *%eax 

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

對於x86_64的,寄存器是:%rax