C ++ ASM Inline, как использовать логическое значение? - PullRequest
4 голосов
/ 25 января 2012

Скажи, что я получил что-то вроде этого ..

bool isPatched;

У меня есть несколько других графических интерфейсов, где я устанавливаю 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

1 Ответ

4 голосов
/ 25 января 2012

Вы хотите 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.

...