繁体   English   中英

在 C++ 中将 integer 传递给 x86 ASM

[英]Passing integer to x86 ASM in C++

我正在尝试在 C++ 中进行一些脚本挂钩,并为此案例设置了一个简单的测试 function。

   void __declspec(naked) testFunct()
{
    int myInt;
    myInt = 2000;
    __asm{
        mov eax, myInt
        jmp [jmp_back_address]
    }
}

当使用它传入 integer 时,function 在被调用时失败并且项目崩溃。 但是,当改用它时,没有 integer 值,它成功通过。

   void __declspec(naked) testFunct()
{
    __asm{
        mov eax, 2000
        jmp [jmp_back_address]
    }
} 

怎样才能顺利通过integer?

汇编器不知道“myInt”是什么意思。 大多数编译器都支持内联汇编,并可以传递值。 例如,对于 GCC,您可以尝试定义一个宏

#define MY_ASM_MACRO(myInt) ({ asm volatile("mov eax,%0\n\t \
          jmp [jmp_back_address]" : : "r"(myInt) : ); })

并像使用它一样

void __declspec(naked) testFunct()
{
   int myInt;
   myInt = 2000;
   MY_ASM_MACRO(myInt)
}

针对我的情况,正确的解决方案是通过 ASM 简单地在 ourFunct() 中执行所有操作,因为将 C++ 和 ASM 混合用于传递变量会产生错误的汇编代码。 有效的 function 调用示例:

int CalculateTotalScore()
{
    return (int)*Game::current_speed_score;
}

DWORD jmpBackAddress;
void __declspec(naked) ourFunct()
{
    __asm{
        call CalculateTotalScore
        jmp [jmpBackAddress]
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM