说我有这样的东西..
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
或 CMP
。在这种情况下,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
根据其他情况,您还可以使用
SUB
、 SETcc
或 MOVcc
您的问题是范围界定之一,当 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;
}
当
b
为 true
时输出 1,当 b
为 false
时输出 0。关于C++ ASM Inline 如何使用 boolean 值?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9002172/