说我有这样的东西..

bool isPatched;

我还有一些其他的 GUI,我在其中设置了 isPatched= true;isPatched= false;isPatched = !isPatched;
void __declspec( naked ) test(void) { //
    __asm {
        PUSHAD
        PUSHFD

        MOV EAX, isPatched
        CMP EAX, 0
        je noPatched
            MOV EAX, DWORD PTR DS:[ESI+0x77C]
            MOV John.oldA, EAX
            MOV EAX, John.A
            MOV DWORD PTR DS:[ESI+0x77C], EAX
            JMP finish
noPatched:
            PUSH EDX
            MOV DWORD PTR DS:[ESI+0x77C], EDX
        finish:
        POPFD
        POPAD

        JMP gotoAddressBack

    }
}

是否可以在内联汇编中使用 bool 运算符?

我认为它认为 isPatched 是一个标签..来自此错误消息。error C2094: label 'isPatched' was undefined

最佳答案

您想要 TESTCMP 。在这种情况下,TEST 是最简单的:

XOR EAX,EAX
MOV AL,isPatched //isPatched would be a byte, hence we need correct operand sizes
TEST EAX,EAX
JE NotSet
Set:
//handle true case
JMP End
NotSet:
//handle false case
End:
//continue

根据其他情况,您还可以使用 SUBSETccMOVcc
您的问题是范围界定之一,当 ASM 使用时 isPatched 不在范围内,因此它假定它是 DWORD ,然后在生成地址时找不到它的内存标签(符号名称)。您还需要为 bool 使用正确的操作数大小。

MSVC 的脏小测试
bool b = true;
int __declspec( naked ) test(void) {
    __asm {
        xor eax,eax
        MOV al, b
        TEST eax,eax
        JE NotSet
        mov eax,1
NotSet:
        RETN

    }
}

int _tmain(int argc, _TCHAR* argv[])
{
    printf("%d\n", test());
    system("pause");
    return 0;
}

btrue 时输出 1,当 bfalse 时输出 0。

关于C++ ASM Inline 如何使用 boolean 值?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9002172/

10-11 22:00