2013-05-27 73 views
3

我想使用內聯彙編在Visual Studio中跳轉到指定的地址。我試過這個:Visual Studio中聯彙編直接跳轉

_asm { 
    jmp 0x12345678 
} 

但編譯器說:「操作碼不使用這種類型的操作數。」

我該怎麼辦直接跳轉?

+0

內存位置是否總是在完全相同的地方?當例程運行並且使用機器上可用的任何內存時,該位置肯定會被計算出來。相對jmp使用代碼E9。在x86 32位模式下,一跳短跳轉(表示爲長跳轉)是E9 01 00 00 00機器碼。一個dd 01E9和db 0可以複製(我需要dw 0)。相對較短的跳轉並不總是有效。得到它的權利或窗戶繁榮。 – ady

回答

1

據我瞭解,MASM不支持這種類型的跳躍。您有幾種選擇:

mov eax, 12345678h 
jmp eax 

push 12345678h 
ret 

第一種使用一個寄存器,因爲它搖鈴CPU中的CALL/RET配對優化第二招致的性能損失。你也可以使用類型常量或局部變量,我認爲 - 這也消耗了一些額外的字節。我不認爲有任何其他方式,也沒有任何直接的,單線的手段在MASM中執行這樣的直接跳轉。

警告:這是假設你在x86代碼的工作。你的OP建議和jmp參數的大小一樣多,但如果這是x64,那麼答案顯然是不同的。

+0

尼斯MOV EAX,12345678 - 推EAX - RET作品對我的內聯彙編的x86 – ady

+0

@ady好奇,爲什麼你會結合這些並使用寄存器 - 爲什麼不繞過EAX,做一個直接的推/ RET(像第二個例子)? –

+0

我的原始編程是mov eax,看看進入eax的位置。Mov eax,位置jmp [eax]不適用於我(jmp eax) – ady

0

嘗試設置一個VAR的地址:

unsigned int var = 0x12345678; 
_asm { 
    jmp [var] 
} 
+0

好的這是一個內存間接跳轉。但似乎這是最接近我可以MASM :( – user2252343

+0

得到我不是專家,但也許MASM((微軟彙編)不支持絕對跳轉。嘗試[FASM(http://flatassembler.net/) 。而不是 –

0

如果你使用的連接器選項/ DYNAMICBASE:NO /定速/ BASE:0X [你的基地址]爲你的模塊,你可以使用:

_asm 
{ 
    jmp label1 + 0xFFFFFF 
label1: 
} 

其中在拆卸編譯爲:

_asm 
    { 
     jmp label1 + 0xFFFFFF 
040117DC E9 FF FF FF 00  jmp   050117E0 
    label1: 
    } 

然後就可以玩得到一個E9跳轉到你的目的地地址。