首页 > 解决方案 > 替代运算符 - 导致内联汇编错误

问题描述

我正在开发一个用 C++ 编写的项目,该项目涉及将源代码注入到已编译(并正在运行)的进程中,因此在某些情况下,我需要编写内联汇编。这个简短的介绍是为了避免任何评论告诉我可能不应该使用内联汇编。

所以,至于我的实际问题,我发现 C++ 有替代运算符,其中一些,特别是andor让我想起了很多 Python,一种我觉得在语法方面非常令人愉快的编程语言。

我知道使用这些替代运算符当然不是最佳实践,应该避免,但这是一个个人项目,因此其他人的代码可读性不会太困扰我。

我的项目是使用 MSVC 编译器编译的,我的第一个观察是这些替代运算符似乎没有默认定义。经过一番研究,我发现启用它们的一种方法是包含<ciso646>. 所以任务完成了,我想。

但是在编译时,我发现我的内联汇编代码片段现在导致编译错误,因为它们包含诸如orand之类的 asm 指令。是的,内联汇编是用小写的。因此,可能的解决方法是将我所有的内联汇编代码片段大写,但由于我不太喜欢 ALL CAPS RAGE STYLE,所以我在这里询问是否有任何其他解决方法来解决这个问题。

这是导致问题的内联汇编的示例

__declspec (naked) Unit* __fastcall D2CLIENT_GetClientUnit(int nGUID, DWORD dwType)
{
    /*
        push dwType
        mov eax, nGUID & 0x7F
        mov edx, ((dwType << 9) + D2CLIENT_6FBBA608)
        call D2CLIENT_6FB54E20
    */

    __asm
    {
        push edx
        mov eax, ecx
        shl edx, 0x09
        and eax, 0x7F
        add edx, [D2CLIENT_6FBBA608]
        call D2CLIENT_6FB54E20
        retn
    }
}

谢谢

标签: c++visual-c++operators

解决方案


推荐阅读