代码之家  ›  专栏  ›  技术社区  ›  Max

Visual C内联汇编程序中的Immediate call/jmp

  •  3
  • Max  · 技术社区  · 15 年前

    当我试图在VC++2010内联汇编程序中立即调用或跳转时

    _asm 
    {
        call 00405B90h;
        jmp 00405B90h;
        jmp far 00405B90h;
    }
    

    它会产生一个错误

    C2415: improper operand type
    

    到目前为止,我有一项工作:

    _asm 
    {
        push 00405B90h; // This is a jump work around
        call 00405B90h;        
    }
    
    2 回复  |  直到 15 年前
        1
  •  7
  •   Peter Cordes    7 年前

    根据要调用的内容,为地址设置一个var并执行以下操作:

    DWORD var = 0xDEADBEEF;
    __asm jmp [var]
    

    或者,我所做的:

    __asm
    {
        mov eax,ModuleBase
        add eax,RVA
        call eax ;obviously call can be jmp
    }
    

    您可以很容易地对此进行宏处理(添加寄存器参数可能是个好主意):

    #define JMP_IMM(x) __asm mov eax,x \
                       __asm jmp eax
    

    不幸的是,MASM不支持对绝对地址的相对调用,而其他汇编程序(如NASM)也不能对COFF对象文件进行相对调用。因此,工具链的限制迫使您将这种效率较低的机器代码与间接调用或jmp一起使用。

        2
  •  0
  •   plan9assembler    15 年前

    碳钢:[00405B90h]

    推荐文章