我想使用內聯彙編在Visual Studio中跳轉到指定的地址。我試過這個:Visual Studio中聯彙編直接跳轉
_asm {
jmp 0x12345678
}
但編譯器說:「操作碼不使用這種類型的操作數。」
我該怎麼辦直接跳轉?
我想使用內聯彙編在Visual Studio中跳轉到指定的地址。我試過這個:Visual Studio中聯彙編直接跳轉
_asm {
jmp 0x12345678
}
但編譯器說:「操作碼不使用這種類型的操作數。」
我該怎麼辦直接跳轉?
據我瞭解,MASM不支持這種類型的跳躍。您有幾種選擇:
mov eax, 12345678h
jmp eax
或
push 12345678h
ret
第一種使用一個寄存器,因爲它搖鈴CPU中的CALL/RET配對優化第二招致的性能損失。你也可以使用類型常量或局部變量,我認爲 - 這也消耗了一些額外的字節。我不認爲有任何其他方式,也沒有任何直接的,單線的手段在MASM中執行這樣的直接跳轉。
警告:這是假設你在x86代碼的工作。你的OP建議和jmp參數的大小一樣多,但如果這是x64,那麼答案顯然是不同的。
嘗試設置一個VAR的地址:
unsigned int var = 0x12345678;
_asm {
jmp [var]
}
好的這是一個內存間接跳轉。但似乎這是最接近我可以MASM :( – user2252343
得到我不是專家,但也許MASM((微軟彙編)不支持絕對跳轉。嘗試[FASM(http://flatassembler.net/) 。而不是 –
如果你使用的連接器選項/ DYNAMICBASE:NO /定速/ BASE:0X [你的基地址]爲你的模塊,你可以使用:
_asm
{
jmp label1 + 0xFFFFFF
label1:
}
其中在拆卸編譯爲:
_asm
{
jmp label1 + 0xFFFFFF
040117DC E9 FF FF FF 00 jmp 050117E0
label1:
}
然後就可以玩得到一個E9跳轉到你的目的地地址。
內存位置是否總是在完全相同的地方?當例程運行並且使用機器上可用的任何內存時,該位置肯定會被計算出來。相對jmp使用代碼E9。在x86 32位模式下,一跳短跳轉(表示爲長跳轉)是E9 01 00 00 00機器碼。一個dd 01E9和db 0可以複製(我需要dw 0)。相對較短的跳轉並不總是有效。得到它的權利或窗戶繁榮。 – ady