gpt4 book ai didi

C++ ASM Inline如何使用boolean?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:56:22 27 4
gpt4 key购买 nike

说我有这样的东西..

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 是一个标签.. 从这个错误消息。错误 C2094:标签“isPatched”未定义

最佳答案

您想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。

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com