Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual studio Visual studio内联程序集直接跳转_Visual Studio_Assembly_Inline Assembly - Fatal编程技术网

Visual studio Visual studio内联程序集直接跳转

Visual studio Visual studio内联程序集直接跳转,visual-studio,assembly,inline-assembly,Visual Studio,Assembly,Inline Assembly,我想在VisualStudio中使用内联程序集跳转到特定地址。我试过这个: _asm { jmp 0x12345678 } 但是编译器说:“操作码不使用这种类型的操作数。” 如何进行直接跳转?尝试将变量设置为地址: unsigned int var = 0x12345678; _asm { jmp [var] } 据我所知,MASM不支持这种类型的跳转。您有几个选择: mov eax, 12345678h jmp eax 或 第一个使用寄存器,第二个导致性能下降,因为

我想在VisualStudio中使用内联程序集跳转到特定地址。我试过这个:

_asm {
    jmp 0x12345678
}
但是编译器说:“操作码不使用这种类型的操作数。”


如何进行直接跳转?

尝试将变量设置为地址:

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

据我所知,MASM不支持这种类型的跳转。您有几个选择:

mov eax, 12345678h
jmp eax

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


警告:假设您使用的是x86代码。您的OP根据jmp参数的大小提出了同样多的建议,但如果这是x64,则答案显然会不同。

如果您正在为模块使用链接器选项/DYNAMICBASE:NO/FIXED/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机器代码。可以复制dd 01E9和db 0(可能需要dw 0)。相对较短的跳跃并不总是有效的。把它弄好,否则窗户会砰的一声关上。很好。mov-eax,12345678——push-eax——ret适用于我的内联x86 asm。@我很好奇为什么要将这些结合起来并使用寄存器-为什么不直接绕过eax并进行直接push/ret(如第二个示例)?我最初的程序是mov-eax,位置是查看进入eax的内容。Mov-eax,位置jmp[eax]对我不起作用。(jmp-eax做过)@ady好奇的。。。推送位置——ret,在任何情况下都应该直接起作用。但是,如果您是
[eax]
而不是
eax
,请注意,您是在取消对eax的引用,而不是直接使用它(因为它是一个寄存器)。MASM容忍方括号中的一些粗枝大叶,这可能会导致意外…@user2252343-是的,其他汇编程序会允许您这样做(例如,FASM)。这是microsoft内联汇编程序的一个限制。好的,这是内存间接跳转。但这似乎是我与MASM最接近的地方:(我不是专家,但可能MASM((Microsoft Assembler)不支持绝对跳转。请尝试。
    _asm
    {
        jmp label1 + 0xFFFFFF
040117DC E9 FF FF FF 00       jmp         050117E0  
    label1:
    }