【问题标题】:C++ ASM Inline how to use boolean?C++ ASM Inline 如何使用布尔值?
【发布时间】:2012-01-25 11:46:02
【问题描述】:

说我得到了这样的东西..

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

【问题讨论】:

  • test eax,0 将导致je 一直跳转。
  • 哦.....我必须使用CMP然后对吗?
  • isPatched != isPatched 始终为假。你的意思是= !
  • 是的 opps isPatched = !isPatched
  • @SSpoke:要么使用cmp eax, 0,要么使用test eax, eax

标签: c++ inline-assembly boolean


【解决方案1】:

您想要TESTCMPTEST 在这种情况下是最简单的:

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


您的问题是作用域之一,isPatched 在 ASM 使用时不在作用域内,因此它假定它是 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。

【讨论】:

  • 是的哈哈,我明白了。我想知道为什么 isPatched 一个全局布尔值 bool 没有被内联 ASM 注册,这是不允许的?
  • @SSpoke:您的问题是范围界定问题,但它让我想起了我需要添加的其他内容,bools 是字节大小......
  • 嗯,我得到了error C2443: operand size conflictMOV AL,isPatched
  • @SSpoke,那么这意味着bool 不是您系统上的字节,或者它是BOOL,而不是bool(我的示例运行良好)。
  • MOV AL, BYTE PTR isPatched 删除了该错误,但现在再次导致 isPatched 标签未定义的错误..即使它不是标签。上面的好例子
猜你喜欢
  • 1970-01-01
  • 2022-01-21
  • 1970-01-01
  • 2010-12-27
  • 2023-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多