3

我想在 Visual Studio 中使用内联汇编来跳转到特定地址。我试过这个:

_asm {
    jmp 0x12345678
}

但是编译器说:“操作码不使用这种类型的操作数。”

怎么做直跳?

4

3 回答 3

3

据我了解,MASM不支持这种跳转。你有几个选择:

mov eax, 12345678h
jmp eax

或者

push 12345678h 
ret

第一个使用寄存器,第二个会导致性能下降,因为它扰乱了 CPU 中的 CALL/RET 配对优化。我认为您还可以使用类型化常量或局部变量 - 这也会消耗一些额外的字节。我认为在 MASM 中没有任何其他方式,也没有任何直接的单行方式来执行像这样的直接跳跃。

警告:这假设您正在使用 x86 代码。您的 OP 从 jmp 参数的大小中提出了同样的建议,但如果这是 x64,那么答案显然会有所不同。

于 2013-05-28T00:08:12.090 回答
0

尝试将 var 设置为地址:

unsigned int var = 0x12345678;
_asm {
    jmp [var]
}   
于 2013-05-28T00:05:27.347 回答
0

如果您为模块使用链接器选项 /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 跳转到您的目标地址。

于 2015-09-18T17:36:03.470 回答