我想在 Visual Studio 中使用内联汇编来跳转到特定地址。我试过这个:
_asm {
jmp 0x12345678
}
但是编译器说:“操作码不使用这种类型的操作数。”
怎么做直跳?
我想在 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]
}
如果您为模块使用链接器选项 /DYNAMICBASE:NO /FIXED /BASE:0x[your base address],则可以使用:
_asm
{
jmp label1 + 0xFFFFFF
label1:
}
在反汇编中编译为:
_asm
{
jmp label1 + 0xFFFFFF
040117DC E9 FF FF FF 00 jmp 050117E0
label1:
}
然后,您可以四处玩耍以获得 E9 跳转到您的目标地址。