Вы хотите 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
Ваша проблема связана с областью видимости, 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;
}
выводит 1, когда b
равно true
, или 0, когда b
равно false
.