所以我在%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 2012-04-23 10:10:51
,如果沒有別的工作,你總是可以使用下面的技巧:
push eax
ret
在AT&T語法的情況下更像'pushl%eax#ret' :) – 2012-04-22 21:03:34
感謝@NiklasB。!我只是給出了這個想法......我不熟悉AT&T的語法,但我不想讓這個想法通過... – guga 2012-04-22 21:07:26
請注意,大多數現代80x86 CPU會跟蹤緩衝區中的調用/返回,以便它們可以預測RET將返回到什麼地址(並繼續進行推測性執行),然後才能知道RET將實際返回到什麼地方。假立即返回將會導致性能下降並損害性能,從立即「返回錯誤預測」(而不是可能的「jmp /分支預測」)開始,並可能繼續返回緩衝區深度的「返回錯誤預測」。基本上,不要這樣做,除非你必須(而且你不必在這種情況下)。 – Brendan 2012-04-22 22:59:44
// target address in eax
jmp *%eax
// target pointer address in eax
jmp *(%eax)
對於x86_64的,寄存器是:%rax
您正在使用哪種彙編程序? – Crashworks 2012-04-22 20:58:36
試試'jmp *%eax' – ughoavgfhw 2012-04-22 20:59:27
@Crashworks,只有GAS(只計算主流彙編程序)使用這種奇怪而且無法讀取的語法... – Griwes 2012-04-22 20:59:53