Определение переменной / метки для использования с инструкцией JMP встроенной сборки - PullRequest
0 голосов
/ 22 апреля 2020

У меня есть функция со встроенной сборкой, которая имеет следующее определение:

void __declspec(naked) func()
{
    __asm 
    {
        //...
        JMP [address]
        //...
    }
}

Эта переменная адреса известна только во время выполнения, в основном у меня есть:

int main()
{
    //...
    DWORD address = getAddress();
    func();
    //...
}

As таким образом, код не будет компилироваться со следующим сообщением об ошибке:

ошибка C2094: метка 'адрес' была неопределена

  1. Как я могу обойти эту проблему, зная, что я не могу передать адрес в качестве параметра функции func()?

  2. Могу ли я определить адрес в пространстве имен? Будет ли это хорошей практикой? Можно ли использовать пространства имен для расширения области действия переменной (используя эту переменную в различных функциях / областях)?

1 Ответ

0 голосов
/ 22 апреля 2020

вы находитесь в C ++, деструкторы должны вызываться, когда вы оставляете блоки, имеющие экземпляры классов в стеке, это не будет иметь место с вашим JMP, и я не говорю о значении указателя / фрейма стека

C ++ имеют исключения, используйте их, например, укажите в аргументе адрес функции без аргумента для вызова в вашей части сборки, и эту функцию throw вы хотите исключить, и поместите try-catch в пункт назначения вы хотите go

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...